程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> c++中char *和char []的區別

c++中char *和char []的區別

編輯:vc教程

問題引入:

在實習過程中發現了一個以前一直默認的錯誤,同樣char *c = "abc"和char c[]="abc",前者改變其內

容程序是會崩潰的,而後者完全正確。

程序演示:

測試環境Devc++

代碼

#include <iostream>
using namespace std;

main()
{
   char *c1 = "abc";
   char c2[] = "abc";
   char *c3 = ( char* )malloc(3);
   c3 = "abc";
   printf("%d %d %s\n",&c1,c1,c1);
   printf("%d %d %s\n",&c2,c2,c2);
   printf("%d %d %s\n",&c3,c3,c3);
   getchar();
}

運行結果

2293628 4199056 abc

2293624 2293624 abc

2293620 4199056 abc

參考資料:

首先要搞清楚編譯程序占用的內存的分區形式:

一、預備知識—程序的內存分配

一個由c/C++編譯的程序占用的內存分為以下幾個部分

1、棧區(stack)—由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似於

數據結構中的棧。

2、堆區(heap)—一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。

3、全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束後由系統釋放。

4、文字常量區—常量字符串就是放在這裡的。程序結束後由系統釋放。

5、程序代碼區

這是一個前輩寫的,非常詳細

 //main.cpp
  int a=0;    //全局初始化區
  char *p1;   //全局未初始化區
  main()
  {
   int b;棧
   char s[]="abc";   //棧
   char *p2;         //棧
   char *p3="123456";   //123456\0在常量區,p3在棧上。
   static int c=0;   //全局(靜態)初始化區
   p1 = (char*)malloc(10);
   p2 = (char*)malloc(20);   //分配得來得10和20字節的區域就在堆區。
   strcpy(p1,"123456");   //123456\0放在常量區,編譯器可能會將它與p3所向"123456"優化成一個

地方。
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved