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)
我不确定为什么它最终会出现错误?任何评论/见解深表感谢.
您正在取消引用指向无效内存的指针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*参数),但这解决了内存违规问题.