执行一切后,在程序结束时出现故障?

Fan*_*ier 0 c segmentation-fault

我写了一个快速程序,在给出seg错误之前执行每个语句.

struct foo
{
    int cat;
    int * dog;
};

void bar (void * arg)
{
    printf("o hello bar\n");
    struct foo * food = (struct foo *) arg;
    printf("cat meows %i\n", food->cat);
    printf("dog barks %i\n", *(food->dog));
}
void main()
{
    int cat = 4;
    int * dog;
    dog = &cat;

    printf("cat meows %i\n", cat);
    printf("dog barks %i\n", *dog);

    struct foo * food;
    food->cat = cat;
    food->dog = dog;

    printf("cat meows %i\n", food->cat);
    printf("dog barks %i\n", *(food->dog));

    printf("time for foo!\n");
    bar(food);
    printf("begone!\n");

    cat = 5;
    printf("cat meows %i\n", cat);
    printf("dog barks %i\n", *dog);

//  return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出了结果

cat meows 4
dog barks 4
cat meows 4
dog barks 4
time for foo!
o hello bar
cat meows 4
dog barks 4
begone!
cat meows 5
dog barks 5
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

我不确定为什么它最终会出现错误?任何评论/见解深表感谢.

Mat*_*hen 5

您正在取消引用指向无效内存的指针food.

这条线:

struct foo * food;
Run Code Online (Sandbox Code Playgroud)

声明食物是指向结构foo的指针.但是由于你没有初始化指针,它指向你不拥有的未定义的内存区域.你可以只在堆栈上分配(注意我已经改变了食物的类型):

struct foo food;
food.cat = cat;
food.dog = dog;

printf("cat meows %i\n", food.cat);
printf("dog barks %i\n", *(food.dog));

printf("time for foo!\n");
bar(&food);
Run Code Online (Sandbox Code Playgroud)

或使用malloc(将类型保持为struct foo*):

struct foo * food = malloc(sizeof(struct foo));
if(food == NULL)
  perror("Failed to allocate food.");
Run Code Online (Sandbox Code Playgroud)

以后你应该释放它(虽然在这种情况下它并不重要):

free(food);
Run Code Online (Sandbox Code Playgroud)

程序还有其他问题(例如void*参数),但这解决了内存违规问题.