工作的:
struct data{
int val;
};
int main(void){
struct data *var[2];
(*var)->val = 6;
printf("%d\n", (*var)->val);
return 0;
}
段错误:
struct data{
int val;
};
int main(void){
struct data **var = malloc(3 * sizeof(struct data));
(*var)->val = 6; // <- crash
printf("%d\n", (*var)->val);
return 0;
}
有人可以解释为什么会出现段错误并给我一个工作示例,对我能理解的段错误代码进行最小的更改。
答案 0 :(得分:0)
指针不是malloc
,你取消引用一个无效的指针,因为你的数组是一个poitners数组,它的元素没有指向有效的内存。
试试这个
#include <stdio.h>
#include <stdlib.h>
struct data
{
int val;
};
int main(void)
{
struct data *var[2];
/* You need to malloc before dereferencing `var[0]` */
var[0] = malloc(sizeof(var[0][0]));
if (var[0] != NULL)
{
var[0]->val = 6;
printf("%d\n", var[0]->val);
free(var[0]);
}
return 0;
}
另外,使用(*var)->val = 6
绝对不必要且令人困惑。
在第二种情况下,你也应该做几乎相同的事情,除了指针数组是指向一个poitners数组的指针,因此也需要malloc()
,所以你的第二个例子意外地工作,因为有足够的记忆malloc()
但它也是错的,你应该这样做
#include <stdio.h>
#include <stdlib.h>
struct data
{
int val;
};
int main(void)
{
struct data **var;
var = malloc(2 * sizeof(var[0]));
if (var == NULL)
return -1;
/* You need to malloc before dereferencing `var[0]` */
var[0] = malloc(sizeof(var[0][0]));
if (var[0] != NULL)
{
var[0]->val = 6;
printf("%d\n", var[0]->val);
free(var[0]);
}
free(var);
return 0;
}