我试图找出一个结构真的'是'并遇到问题,所以我真的有两个问题:
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);
}
感谢您的帮助!
答案 0 :(得分:60)
这与结构无关 - C中的数组不可分配:
char a[20];
a = "foo"; // error
你需要使用strcpy:
strcpy( a, "foo" );
或在您的代码中:
strcpy( sara.first, "Sara" );
答案 1 :(得分:9)
或者您可以使用动态分配,例如:
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);
答案 2 :(得分:4)
使用strncpy
确保没有缓冲区溢出。
char name[]= "whatever_you_want";
strncpy( sara.first, name, sizeof(sara.first)-1 );
sara.first[sizeof(sara.first)-1] = 0;
答案 3 :(得分:3)
您也可以像这样初始化它:
struct name sara = { "Sara", "Black" };
因为(作为一种特殊情况)你可以从字符串常量中初始化 char数组。
现在,关于结构实际是什么 - 它是由其他值组成的复合类型。 sara
在内存中实际看起来是一个包含20个连续char值的块(可以使用sara.first
引用,后跟0个或更多填充字节,后跟另外20个连续char值的块(可以使用sara.last
来引用。struct name
类型的所有其他实例都以相同的方式布局。
在这种情况下,不太可能存在任何填充,因此struct name
只是一个包含40个字符的块,您可以为前20个字符和后20个字符命名。
您可以使用struct name
找出sizeof(struct name)
占用的内存块有多大,并且您可以找到该内存块中每个结构成员所在的位置{{1 }和offsetof(struct name, first)
。
答案 4 :(得分:2)
sara
是结构本身,而不是指针(即表示存储实际结构数据的堆栈上的位置的变量)。因此,*sara
毫无意义,无法编译。
答案 5 :(得分:0)
Sara结构是一个包含内部变量的内存块。经典声明之间几乎没有区别:
char first[20];
int age;
和结构:
struct Person{
char first[20];
int age;
};
在这两种情况下,您只是分配一些内存来存储变量,在这两种情况下都会保留20 + 4个字节。在您的情况下,Sara只是一个2x20字节的内存块。
唯一的区别是,对于一个结构,内存被分配为一个块,所以如果你取Sara的起始地址并跳过20个字节,你就会找到“last”变量。这有时很有用。
检查 http://publications.gbdirect.co.uk/c_book/chapter6/structures.html了解更多信息:)。
答案 6 :(得分:0)
您可以使用strcpy填充它。您也可以从另一个结构中初始化它。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct name {
char first[20];
char last[20];
};
int main() {
struct name sara;
struct name other;
strcpy(sara.first,"Sara");
strcpy(sara.last, "Black");
other = sara;
printf("struct: %s\t%s\n", sara.first, sara.last);
printf("other struct: %s\t%s\n", other.first, other.last);
}
答案 7 :(得分:0)
您可以通过这种方式尝试。我已经在我的情况下应用了这个。
#include<stdio.h>
struct name
{
char first[20];
char last[30];
};
//globally
// struct name sara={"Sara","Black"};
int main()
{
//locally
struct name sara={"Sara","Black"};
printf("%s",sara.first);
printf("%s",sara.last);
}