C語言 字串常量賦值給指標後不可修改原因分析

2022-10-10 15:54:12 字數 1475 閱讀 7037

​ 字串賦值給乙個指標後,再次賦值的時候發現會報錯。而將指標當作指標陣列賦值時,卻可以修改。

char* a=(char*)malloc(sizeof(char)*5);

char* b=(char*)malloc(sizeof(char)*5);

a="abc\0";

b[0]='a'; b[1]='b'; b[2]='c'; b[3]='\0';

a[0]='e';

b[0]='e';

檢視指標所指向的位址是否發生改變

char* a=(char*)malloc(sizeof(char)*5);	char* b=(char*)malloc(sizeof(char)*5);

char* d=(char*)malloc(sizeof(char)*5); char* e=(char*)malloc(sizeof(char)*5);

//列印位址

printf("a:%d\n",&*a); printf("b:%d\n",&*b); printf("d:%d\n",&*d); printf("e:%d\n",&*e);

printf("\n\n");

a="abc\0"; e="abc\0";

b[0]='a'; b[1]='b'; b[2]='c'; b[3]='\0';

char c[5]="abc\0";

d="abcd\0";

//賦值之後列印位址,檢視是否發生變化

總結:

(1)發現將乙個字串常量賦值給指標後,指標所指向的位址改變了。a和e是兩個指標變數,但是在使用相同的字串常量賦值後,所指向的記憶體位址是乙個。

(2)陣列c可以修改,且位址空間離其它變數特別遠。

​ 說明:陣列c開闢的空間在堆疊裡。

(3)

a="abc\0";d="abcd\0";
​ a和d所指向的字串僅僅差了乙個字母,但位址緊鄰卻不同。

​ 說明:這是兩個字串常量,同時也說明說明:程式在初始化的時候僅會將該程式將使用的字串常量放到乙個區域(僅讀不可修改)。

(4)b的位址沒有改變。

​ 在使用 malloc()為指標開闢空間時,開闢的空間都是指向堆疊裡的空間。但如果用常量給其賦值,指標就會指向不可修改的常量區,但之前開闢的空間仍然存在。

C語言常量字串

關於c語言字串常量不可修改,起初誤認為是編譯器 把這樣的 char s str 優化成了 const char str const屬性也去不了。但是實際上是與常量字串的記憶體體現有關。bodata段 bss段 bss段 bsssegment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域...

c語言不能把字元常量賦值給字元陣列

char s 20 s helo 這樣是錯誤的,原因就是不能用賦值語句將乙個字串常量直接給乙個字元陣列賦值。char s 20 char ss hello s ss 這也是錯誤的,原因是不能用賦值語句將乙個字元陣列直接給乙個字元陣列賦值 即字串的複製 c語言中,但是在c 的string 類,上面的賦...

為什麼字串可以賦值給字元指標變數

2.指標可以自增,而陣列不能自增 指標是位址變數,而陣列是位址常量 3.void指標不能進行指標運算,也不能進行 取值操作 所指向的物件型別不確定 5.字元常量的型別可以理解為字元常量陣列的型別。例如 abcd 的型別可以看成 const char 5 6.陣列的型別是由該陣列所存放的元素的型別和陣...