使用结构中的指针数组重新分配

Spa*_*ire 2 c struct pointers realloc

在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;
}
Run Code Online (Sandbox Code Playgroud)

执行时显示:3 6

但如果我更换

var = malloc(sizeof(foo) + 2 * sizeof(int*));
Run Code Online (Sandbox Code Playgroud)

var = malloc(sizeof(foo));
var = realloc(var, sizeof(foo) + 2 * sizeof(int*));
Run Code Online (Sandbox Code Playgroud)

它编译时没有任何警告,但我在以下行得到了分段错误:

var->ptr[0] = &a;
Run Code Online (Sandbox Code Playgroud)

我真的不知道我做错了什么,所以我很感激任何输入.我是初学者,所以如果我的错误显而易见,我道歉.

谢谢.

Jon*_*ood 5

我认为你的声明是错误的.以下行假定ptr指向一些内存,实际上它根本没有被初始化!

var->ptr[0] = &a;
Run Code Online (Sandbox Code Playgroud)

如果你的编译器支持它,不应该更像这样:

typedef struct{
    int size;
    int* ptr[0];
}foo;
Run Code Online (Sandbox Code Playgroud)

否则,更改ptr[0]ptr[1],并据此调整的事实已经结构包括一个元素的计算.

注意:写入错误的地址后,结果将是未定义的.你有一个问题但它只会出现在一个案例中.在这两种情况下,问题仍然存在.