为什么在评论malloc()调用时出现分段错误(内核已转储)?

时间:2018-10-20 07:08:20

标签: c pointers struct malloc

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);
}

3 个答案:

答案 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);
}