int main()
{
struct stuff
{
int num;
}*foo;
// If I comment the line below, I get core dump error.
// Why?
foo = (struct stuff *)malloc(sizeof(struct stuff));
(*foo).num = 7;
printf("%d\n", (*foo).num);
}
答案 0 :(得分:3)
仅允许您取消引用 valid 指针。
在您的情况下,foo
是一个自动局部变量,除非显式初始化,否则它包含一些不确定的值,即,它指向任意的内存位置,这从程序的角度来看几乎是无效的。 / p>
如果没有为foo
分配有效的指针(例如,由malloc()
返回),则foo
指向某个不确定内存位置并尝试取消引用它将调用undefined behaviour。
分段错误是UB的副作用之一。
答案 1 :(得分:0)
foo是一个指针,它必须指向地址 如果您不想使用malloc,则可以执行以下操作:
struct stuff _foo;
foo = &_foo;
(*foo).num = 7;
答案 2 :(得分:0)
foo
是指向您刚定义的结构的未初始化指针。如果未使用有效的内存块进行初始化,则将始终导致SEGFAULT。代码的另一个坏处是,即使为它分配了内存,也不会释放它。
如果您不想使用malloc
,只需将其设置为局部变量即可:
int main()
{
struct stuff
{
int num;
}foo;
foo.num = 7;
printf("%d\n", foo.num);
}