使用C中的字符串成员复制结构

Nic*_*ori 3 c arrays string struct

我有一个简单的结构,包含一个定义为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;
}
Run Code Online (Sandbox Code Playgroud)

使用gcc 4.9.2编译此代码我得到:

t1: Hello 0x7fffb8fc9df0
t2: world 0x7fffb8fc9dd0
t2: Hello 0x7fffb8fc9dd0
Run Code Online (Sandbox Code Playgroud)

据我所知,在t2 = t1t2.str指向它在赋值之前指向的相同内存地址之后,但是现在在该地址内部,在t1.str中找到了相同的字符串.所以在我看来,字符串内容已经自动从一个内存位置复制到另一个内存位置,这是我认为C不会做的事情.我认为这种行为是由于我将str声明为a char[]而非a 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;
      ^
Run Code Online (Sandbox Code Playgroud)

这让我觉得在某些情况下,数组的处理方式与指针不同.我仍然无法弄清楚数组赋值的规则是什么,或者换句话说,当我将一个结构复制到另一个结构时,为什么复制结构中的数组,但是我不能直接将一个数组复制到另一个数组中.

Mic*_*aud 11

该结构不包含指针,但包含20个字符.之后t2 = t1,将20个字符t1复制到t2.