我试图为单个枚举变量分配一些内存,但是我的代码给了我分段错误。它会打印出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;
}
答案 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;
实际上是一个完全有效的任务。该程序不会崩溃,只会泄漏内存。