我有一個簡單的結構包含一個字符串定義爲一個字符數組。我認爲使用賦值運算符將結構的實例複製到另一個實例只會複製存儲在char指針中的內存地址。相反,似乎字符串內容被複制。我把一個很簡單的例子:複製C中的字符串成員的結構
#include <stdio.h>
#include <string.h>
struct Test{
char str[20];
};
int main(){
struct Test t1, t2;
strcpy(t1.str, "Hello");
strcpy(t2.str, "world");
printf("t1: %s %p\n", t1.str, (char*)(t1.str));
printf("t2: %s %p\n", t2.str, (char*)(t2.str));
t2 = t1;
printf("t2: %s %p\n", t2.str, (char*)(t2.str));
return 0;
}
用gcc 4.9.2編譯此代碼我得到:
t1: Hello 0x7fffb8fc9df0
t2: world 0x7fffb8fc9dd0
t2: Hello 0x7fffb8fc9dd0
據我瞭解,經過t2 = t1
t2.str指向它指向相同的內存地址在賦值之前,但現在在該地址內,在t1.str中有相同的字符串。所以在我看來,字符串內容已被自動從一個內存位置複製到另一個位置,這是我認爲C不會做的事情。我認爲這種行爲是由於我宣佈str爲char[]
而不是char*
而引發的。事實上,試圖直接一個串到另一個t2.str = t1.str
分配給了這個錯誤:
Test.c: In function ‘main’:
Test.c:17:10: error: assignment to expression with array type
t2.str = t1.str;
^
這讓我覺得陣列有效治療不同於在某些情況下指針。仍然我無法弄清楚哪些是數組賦值的規則,或者換句話說,爲什麼當我將一個結構體複製到另一個結構體時,爲什麼數組中的數組會被複制,但我不能直接將一個數組複製到另一個結構體中。
*在某些情況下,數組的有效處理方式與指針不同*它們是完全不同的公民。 – user3125367