我有一个简单的结构,其中包含一个定义为 char 数组的字符串。我认为使用赋值运算符将结构的一个实例复制到另一个实例只会复制存储在 char 指针中的内存地址。相反,字符串内容似乎被复制了。我举了一个非常简单的例子:
#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;
^
这让我觉得在某些情况下,数组的处理方式与指针不同。我仍然无法弄清楚数组赋值的规则是什么,或者换句话说,为什么当我将一个结构复制到另一个结构时复制结构内的数组,但我不能直接将一个数组复制到另一个数组。
最佳答案
该结构不包含指针,但包含 20 个字符。
在t2 = t1
之后,t1
的20个字符被复制到t2
中。
关于在 C 中复制一个带有字符串成员的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30002764/