我试图找出一个结构真的'是'并遇到问题,所以我真的有两个问题:
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)
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)
您也可以像这样初始化它:
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)。