带有枚举的Malloc / Free给出了分段错误 - 简单的代码

时间:2014-08-13 21:32:59

标签: c enums segmentation-fault malloc free

我试图为单个枚举变量分配一些内存,但是我的代码给了我分段错误。它会打印出2和3,但最后还会显示seg错误,为什么?

我使用gcc(Ubuntu / Linaro 4.8.1-10ubuntu9)4.8.1

#include <stdio.h>
#include <stdlib.h>

enum direction
{
    up, down, left, right
};

int main(int argc, char **argv)
{

    enum direction d1;
    d1 = left;
    printf("%d\n", d1);

    enum direction *d2;
    d2 = malloc(sizeof(enum direction));
    d2 = right;
    printf("%d\n", d2);
    free(d2);

    return 0;
}

3 个答案:

答案 0 :(得分:3)

d2是一个指针,而不是一个枚举。您无法为其指定枚举值。它应该是

*d2 = right;

取消引用指针,然后将right放入d2指向的内存中。你这样做会覆盖指针本身。

在使用它之前,您还应检查malloc的返回值,以确保它是有效的指针。

d2 = malloc(sizeof(enum direction));

if (d2 != NULL)
{
    *d2 = right;
    ...
    free(d2);
}
else
{
    // handle error
}

答案 1 :(得分:2)

下面

printf("%d\n", d2);

您将指针传递给%d格式说明符,这会导致未定义的行为。

在这里

d2 = right;

覆盖调用malloc时分配的动态内存地址的变量。因此

free(d2);

尝试释放未使用malloc分配的内容。这导致未定义的行为。

大概是你的意思

*d2 = right;
printf("%d\n", *d2);

我建议你打开所有警告并注意它们。如果您这样做,我相信您的编译器可以在运行程序之前确定问题。

答案 2 :(得分:0)

d2 = right;

是一个格式错误的表达式声明。 d2是一个指针。 right是一个整数。为指针分配整数值是违法的(除非整数是零常量)。这是C语言中的“错误”。它不会在迂腐的C编译器中编译。任何兼容的编译器都需要为此分配发出诊断消息。 GCC编译器也这样做。显然,您只是忽略了该诊断消息。这意味着程序的行为不是由C语言定义的。它不是C程序。

您可能忽略的另一个GCC诊断消息是此声明的消息

printf("%d\n", d2);

它应该告诉你printf - 通过%d格式说明符的指针是非法的。

不要忽略编译器发出的诊断消息。在许多情况下,这将帮助您自己回答诸如“为什么我的程序会出现段错误”等问题。

P.S。作为一个奇怪的旁注:d2 = up;实际上是一个完全有效的任务。该程序不会崩溃,只会泄漏内存。