结构中的字符数组 - 不兼容的赋值?

Pat*_*ick 33 c struct char

我试图找出一个结构真的'是'并遇到问题,所以我真的有两个问题:

1)'sara'中保存了什么?它是指向结构的第一个元素的指针吗?

2)更有趣的问题:为什么不编译?GCC说"test.c:10:错误:分配中的不兼容类型",我无法弄清楚为什么......(这部分已经通过你的答案解决了,太棒了!)

#include <stdio.h>

struct name {
    char first[20];
    char last[20];
};

int main() {
    struct name sara;
    sara.first = "Sara";
    sara.last = "Black";
    printf("struct direct: %x\n",sara);

    printf("struct deref: %x\t%s\n", *sara, *sara);


}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

小智 63

这与结构无关 - C中的数组不可赋值:

char a[20];
a = "foo";   // error
Run Code Online (Sandbox Code Playgroud)

你需要使用strcpy:

strcpy( a, "foo" );
Run Code Online (Sandbox Code Playgroud)

或者在你的代码中:

strcpy( sara.first, "Sara" );
Run Code Online (Sandbox Code Playgroud)

  • +1对于`strcpy`而不是`strncpy` ... :) (4认同)
  • @GManNickG你能详细说明为什么`strncpy`不好吗? (2认同)

Sco*_*ner 10

或者您可以使用动态分配,例如:

struct name {
  char *first;
  char *last;
};

struct name sara;
sara.first = "Sara";
sara.last = "Black";
printf("first: %s, last: %s\n", sara.first, sara.last);
Run Code Online (Sandbox Code Playgroud)

  • 这不是动态分配。字符串“Sara”和“Black”是在编译时创建的,您只需在运行时将结构成员指向这些字符串。 (3认同)

caf*_*caf 5

您也可以像这样初始化它:

struct name sara = { "Sara", "Black" };
Run Code Online (Sandbox Code Playgroud)

因为(作为特殊情况)您可以从字符串常量初始化字符数组。

现在,至于结构实际上是什么 - 它是由其他值组成的复合类型。什么sara实际上看起来像在存储器是20个连续的炭值的块(其可被称为使用sara.first由0或更多的填充字节,其后,接着20个连续char值的另一个块(其可被称为使用sara.last)。所有其它的struct name类型的实例以相同的方式布局。

在这种情况下,不太可能有任何填充,所以 astruct name只是一个 40 个字符的块,你有前 20 个和最后 20 个的名称。

您可以查明 astruct name使用的内存块有多大sizeof(struct name),并且您可以查明使用offsetof(struct name, first)and 时结构的每个成员在该内存块中的位置offsetof(struct name, last)