【发布时间】:2018-07-02 21:01:16
【问题描述】:
在 C89 中,以下代码可以正常工作:
typedef struct{
int size;
int **ptr;
}foo;
int main()
{
foo *var;
var = malloc(sizeof(foo) + 2 * sizeof(int*));
int a = 3, b = 6;
var->ptr[0] = &a;
var->ptr[1] = &b;
printf("%d %d\n", (*var->ptr[0]), (*var->ptr[1]));
return 0;
}
执行时显示:3 6
但如果我替换
var = malloc(sizeof(foo) + 2 * sizeof(int*));
与
var = malloc(sizeof(foo));
var = realloc(var, sizeof(foo) + 2 * sizeof(int*));
它在没有任何警告的情况下编译,但在以下行出现分段错误:
var->ptr[0] = &a;
我真的不知道我做错了什么,所以我很感激任何意见。我是初学者,如果我的错误很明显,我深表歉意。
谢谢。
【问题讨论】:
-
你永远不会初始化
ptr字段。 -
@DevSolar:嗯,实际上他确实为
ptr分配了内存(这就是+ 2 * sizeof(int*)的用途),他只是没有分配ptr指向那个内存跨度> -
两个版本都是错误的,第一个版本表现出特别糟糕的未定义行为形式 - 它似乎工作正常
-
你到底想做什么?您是否想要该结构的单个连续内存块,包括整数数组。或者你只是想让那个结构指向数组
-
我想知道为什么新手发布他们的问题,然后不留下来回答试图帮助他们的人提出的任何问题。