字符串字面值,段錯誤

字符串字面值也可以像數組名一樣使用,可以加下標訪問其中的字符:

正確:

char c = "Hello, world.\n"[0];

但是通過下標修改其中的字符卻是不允許的:

錯誤:

"Hello, world.\n"[0] = 'A';

字符串字面值是隻讀的,不允許修改。字符串字面值還有一點和數組名類似,做右值使用時自動轉換成指向首元素的指針。

正確:

char str[10] = "Hello";
等價於:
char str[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };

所以

正確:

const char *p = "abcd";
const char str1[5] = "abcd";
char str2[5] = "abcd";
printf(p);
printf(str1);
printf(str2);
printf("abcd");

錯誤:

char *p = "abcd";
p[0] = 'A';

編譯時候:
char p = “abcd”;
warning: ISO C++ forbids converting a string constant to ‘char

運行時候:
段錯誤 (核心已轉儲)!!!

正確:

char *p
char s[] = "abcd";
p = s;
s[0] = 'A';
p[0] = 'A';

字符串”abcd”在常量區中就是一個以’\0’結尾的字符數組,當將此數組賦值給指針 p 時,該數組會被視爲其首字符’a’的地址,因此 p 就存儲了’a’的地址,表現爲指向了以該字符爲首的字符串。而當我們將此數組當做初始值賦給 s 時,實際上就是兩個數組的對拷,拷貝完之後數組 s 裏面就是跟常量區數組一樣的一個字符串。

char *p = "abcd";char s[] = "abcd";結尾都有一個'\0'!

錯誤:

char *p = {'1','2','3'};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章