char *d = "hello word" 中的a是指向第一個字符‘a'的一個指針;char s[20] = "hello" 中數組名a也是執行數組第一個字符'h'的指針。現執行下列操作:strcat(d, s)。把字符串加到指針所指的字串上去,出現段錯誤,本質原因:*d="0123456789"存放在常量區,是無法修的。而數組是存放在棧中,是可以修改的。兩者區別如下:
讀寫能力:char *a = "abcd"此時"abcd"存放在常量區。**通過指針只可以訪問字符串常量,而不可以改變它**。而char a[20] = "abcd"; 此時 "abcd"存放在棧。可以通過指針去訪問和修改數組內容。
賦值時刻:char *a = "abcd"是在編譯時就確定了(因爲爲常量)。而char a[20] = "abcd"; 在運行時確定
存取效率:char *a = "abcd"; 存於靜態存儲區。在棧上的數組比指針所指向字符串快。因此慢,而char a[20] = "abcd"存於棧上,快。
另外注意:char a[] = "012345",雖然沒有指明字符串的長度,但是此時系統已經開好了,就是大小爲6-----`'0' '1' '2' '3' '4' '5' '\0'`,(注意strlen(a)是不計'\0')
舉例說明:
#include<stdio.h>
#include<string.h>
int main()
{
char* a ="abcd";
char *d = "hello word";
char s[20] = "hello";
char str2[] = "word";
char b[] = "012345";
strcat(s,d); // d attach s
printf("s=%s\n",s);
*(a+2) = 'w'; // core dump
//*(str2+2)= 'w';
//a[2] = 'w'; //only read
str2[2] = 'w'; // can write
printf("a=%s\n",a);
printf("str2=%s\n",str2);
}
char* 表示數據可讀,數據存在靜態區;
char [] 表示數據可寫,數據存在棧區;
首先"abcd"是一個字符串常量,存儲在靜態數據區域(data段),這是在編譯時期就確定的。第一個是將字符串常量賦值給了一個變量(全局變量在數據段,局部變量在棧區),實際上是將字符串常量拷貝到了變量內存中,因此修改的只是str[]這個變量的值。
第二個是將字符串常量的首地址賦值給p,對p操作就是對字符串常量進行修改!因此出現了段錯誤