1. 程式人生 > >c: string 字元指標與字元陣列的區分

c: string 字元指標與字元陣列的區分

來看一段簡單的程式碼,以區分字元指標與字元陣列在表達字串時的一些區別。

#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); 這樣也就做到了拷貝副本的行為。