我有一个简单的结构包含一个字符串定义为一个字符数组。我认为使用赋值运算符将结构的实例复制到另一个实例只会复制存储在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