在C90中使用malloc作为双指针

时间:2017-10-27 07:40:33

标签: c pointers struct realloc c89

我正在尝试创建一个struct的数组,但我不知道它的大小。

struct MyStruct** thing;
size_t thing_len = 0;
thing = (struct MyStruct**) malloc(thing_len * sizeof(struct MyStruct*));
//...
thing_len += 1
thing = (struct MyStruct**) realloc(thing_len * sizeof(struct MyStruct*));

当我这样做时thing获取MyStruct*类型而不是MyStruct**并包含0x0。但是当我做的时候

struct MyStruct* thing;
size_t thing_len = 0;
thing = malloc(thing_len * sizeof(struct MyStruct));
//...
thing_len += 1
thing = realloc(thing_len * sizeof(struct MyStruct));

它有效!!

我不知道它是否有所改变,但我使用的是-ansi-pedantic选项。

1 个答案:

答案 0 :(得分:4)

在您的代码中

  realloc(thing_len * sizeof(struct MyStruct*));

是对函数的错误调用。您必须使用格式 [检查man page]

 realloc(<old pointer>, new size);

那说,像

这样的格式
 oldPointer = realloc (oldPointer, newSize);

是一段非常危险的代码。如果realloc()失败,你最终也会丢失原始指针!!

使用realloc()的规定方式是

 tempPointer = realloc (oldPointer, newSize);  //store the return
 if (tempPointer)                              // is it success?
 {
        oldPointer = tempPointer;              // cool, put it back to the variable you want
 }
             //--> here, whether or not realloc is success, you still got a _valid_ pointer.