【发布时间】:2015-07-12 05:21:44
【问题描述】:
我有一个简单的结构,其中包含一个定义为 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;
^
这让我认为在某些情况下,数组的处理方式与指针不同。我仍然无法弄清楚数组分配的规则是什么,或者换句话说,为什么当我将一个结构复制到另一个结构时会复制结构内的数组,但我不能直接将一个数组复制到另一个数组。
【问题讨论】:
-
在某些情况下,数组的处理方式与指针不同它们是完全不同的公民。