簡體   English   中英

char *和char []與strcpy()之間的區別

[英]difference between char* and char[] with strcpy()

過去幾個小時我遇到了一個問題,雖然我明白了。 這是我的麻煩:

void cut_str(char* entry, int offset) {
    strcpy(entry, entry + offset);
}

char  works[128] = "example1\0";
char* doesnt = "example2\0";

printf("output:\n");

cut_str(works, 2);
printf("%s\n", works);

cut_str(doesnt, 2);
printf("%s\n", doesnt);

// output:
// ample1
// Segmentation: fault

我覺得char * / char []有一些重要的東西,我沒有來到這里。

不同之處在於,它doesnt指向屬於字符串常量的內存,因此不可寫。

當你這樣做

char  works[128] = "example1\0";

編譯器將不可寫字符串的內容復制到可寫數組中。 順便說一句, \\0不是必需的。

但是,當你這樣做時,

char* doesnt = "example2\0";

編譯器使指針指向不可寫的內存區域。 同樣, \\0將由編譯器插入。

如果你正在使用gcc ,你可以讓它警告你用字符串文字初始化可寫char * 選項是-Wwrite-strings 您將收到如下警告:

 warning: initialization discards qualifiers from pointer target type

聲明你的正確方法doesnt指針如下:

const char* doesnt = "example2\0";

char[]char *類型非常相似,所以你是對的。 不同之處在於初始化類型的對象時會發生什么。 您的對象works ,類型為char[] ,在堆棧上為其分配了128個字節的變量存儲。 你的目標doesnt ,類型的char *具有堆棧上沒有存儲。

確切位置在哪里串doesnt存儲不是由C標准的規定,但最有可能被存儲在當你的程序被加載執行加載一個不可更改的數據段。 這不是變量存儲。 因此,當您嘗試改變它時的段錯誤。

這在堆棧上分配128個字節,並使用名稱works來引用其地址:

char works[128];

因此, works是指向可寫內存的指針。

這將創建一個字符串文字,它位於只讀內存中,並使用名稱doesnt來引用其地址:

char * doesnt = "example2\0";

您可以將數據寫入works ,因為它指向可寫內存。 您不能將數據寫入doesnt ,因為它指向只讀內存。

另請注意,您不必使用"\\0"結束字符串文字,因為所有字符串文字都會隱式地在字符串末尾添加一個零字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM