在我的程序中,我有两个结构:
#include <stdio.h>
struct human {
struct human_header *human_header;
char *name;
};
struct human_header {
unsigned short number;
};
void f2(struct human_header *human_header) {
human_header->number = 1;
}
void f1(struct human *human) {
f2(human->human_header);
}
int main (int argc, char *argv) {
struct human *human;
f1(human);
printf("END\n");
return 0;
}
我不明白为什么我有分段错误......有人可以解释一下吗?
答案 0 :(得分:1)
您会收到细分错误,因为人类和人类&gt;标头未初始化。 你应该做到以下几点:
human = malloc(sizeof(struct human));
human->header = malloc(sizeof(struct human_header));
f1(human);
free(human->header);
free(human);
答案 1 :(得分:0)
代码行
stuct human* human;
创建一个自动变量human
,它将包含人体结构的地址。你的代码中没有实际创建该结构的地方。
所以你需要做的就是这个;
int main (int argc, char *argv) {
struct human *human = malloc(sizeof(struct human));
if(NULL != human) {
human->human_header = malloc(sizeof(struct human_header));
if(NULL != human->human_header)
{
f1(human);
free(human->human_header);
}
free(human);
}
printf("END\n");
return 0;
}
另外,因为struct human包含指向其他对象的指针,所以在尝试使用它们之前也必须创建这些对象(就像我创建的man_header一样)。您还必须处理name
。
假设struct human_header
不会变得更复杂,那么将struct human定义为:
struct human
{
int number;
char* name;
}
其他一些警告:
malloc(sizeof(struct human))
而不是malloc(sizeof(struct human*))
- 这是我们在开始时至少做一次的另一个常见错误。 答案 2 :(得分:0)
你将一个未初始化的指针传递给f(1),这是好的(但可能不是你想要的)。 然后当你的指针只是结构的TYPE时,你尝试访问一个struc字段,但结构本身不存在......
您可以关注此代码所发生的事情(它实际上是您的代码与printf ..):
#include <stdio.h>
struct human {
struct human_header *human_header;
char *name;
};
struct human_header {
unsigned short number;
};
void f2(struct human_header *human_header) {
human_header->number = 1;
}
void f1(struct human *human) {
printf("%p \n", human);
f2(human->human_header);
}
int main (int argc, char *argv) {
struct human *human;
printf("%p\n", human);
f1(human);
printf("END\n");
return 0;
}