c: string 字元指標與字元陣列的區分
阿新 • • 發佈:2019-01-31
來看一段簡單的程式碼,以區分字元指標與字元陣列在表達字串時的一些區別。
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char * str = "Kotlin";
// str[0] = 'J'; // Bus error:10
puts(str);
char string[10] = "Kotlin";
string[0] = 'J'; // ok
puts(string);
return 0;
}
輸出如下:
Kotlin
Jotlin
看到這個輸出以及註釋,為什麼// str[0] = 'J'; // Bus error:10
這一句會報錯呢?
ps: 在部分編譯器上面不會報錯,也能修改成功。但是這種行為是c
標準未定義的,依賴於編譯器自己的實現。
首先,這兩種方式是有本質區別的:第一種:使用指標去初始化一個字串,實際上系統只開闢了一個字元指標的空間,字串還是儲存在靜態儲存區,所以,如果做修改,就會修改靜態儲存區的"Kotlin"
,這當然是不合理的,因為這會導致,你係統中所有的"Kotion"
都會被改成"Jotlin"
;而字元陣列就不會,這種方式去初始化一個字串,實際上是拷貝了這個字串的一個副本。這樣你隨意修改並不會影響系統中其他地方對這個字串的正常使用。
正是因為一個是指向,一個是拷貝副本,所以,一個只能讀,不能寫;而另一個可讀可寫。
ps: 如果想使用字元指標來表達一個可讀性的字串,就需要先malloc(size)
,然後strcpy(dest,src);
這樣也就做到了拷貝副本的行為。