正确使用Realloc

时间:2017-06-27 20:27:36

标签: c realloc

这是我被教导使用realloc()的方式:

int *a = malloc(10);
a = realloc(a, 100); // Why do we do "a = .... ?"
if(a == NULL) 
//Deal with problem.....

这不是多余的吗?我不能这样做吗? :

if(realloc(a, 100) == NULL) //Deal with the problem

我发现的其他realloc示例也是如此,例如:

int *oldPtr = malloc(10);
int * newPtr = realloc(oldPtr, 100);
if(newPtr == NULL) //deal with problems
else oldPtr = newPtr;

我不能这样做吗? :

int *oldPtr = malloc(10);
if(realloc(oldPtr, 100) == NULL)  //deal with problems
//else not necessary, oldPtr has already been reallocated and has now 100 elements

4 个答案:

答案 0 :(得分:5)

realloc返回指向已调整大小的缓冲区的指针;此指针值可能与原始指针值不同,因此您需要将该返回值保存在某处。

如果请求无法满足,则

realloc可能会返回NULL(在这种情况下,原始缓冲区保留在原位)。因此,您希望将返回值保存为与原始不同的指针变量。否则,您可能会使用NULL覆盖原始指针,并失去对该缓冲区的唯一引用。

示例:

size_t buf_size = 0; // keep track of our buffer size

// ...

int *a = malloc(sizeof *a * some_size); // initial allocation
if (a)
    buf_size = some_size;

// ...

int *tmp = realloc(a, sizeof *a * new_size); // reallocation
if (tmp) {
    a = tmp;             // save new pointer value
    buf_size = new_size; // and new buffer size
}
else {
    // realloc failure, handle as appropriate
}

答案 1 :(得分:3)

失败时realloc保留原始指针和大小。成功时realloc可能不会(通常不会)返回与输入完全相同的指针。

所以正确的解决方案是你的第三个例子。

int *oldPtr = malloc(10);
int * newPtr = realloc(oldPtr, 100);
if(newPtr == NULL) //deal with problems
else oldPtr = newPtr;

答案 2 :(得分:3)

调用realloc的正确方法是将返回值保存在临时变量中并检查它是否为NULL。这样,如果realloc失败,你就没有丢失原始内存。例如:

int *a, *b;
a = malloc(10); 
b = realloc(a, 100);
if (b == NULL) {
    // handle error and exit
}
a = b;

编辑:请注意,如果错误处理没有退出,您应该将最后一行放在上面,即a = b;在else子句中。

答案 3 :(得分:2)

此代码段错误。

int *a = malloc(10);
a = realloc(a, 100); // Why do we do "a = .... ?"
if(a == NULL) 
//Deal with problem.....

如果realloc的调用返回NULL,则指针a的先前值将丢失。因此可能存在内存泄漏,因为无法释放malloc调用分配的内存。

如果只是写

if(realloc(a, 100) == NULL) //Deal with the problem

然后又可以丢失realloc调用的返回指针。

此代码段

int *oldPtr = malloc(10);
int * newPtr = realloc(oldPtr, 100);
if(newPtr == NULL) //deal with problems
else oldPtr = newPtr;

是对的。但是如果要写

int *oldPtr = malloc(10);
if(realloc(oldPtr, 100) == NULL)  //deal with problems
//else not necessary, oldPtr has already been reallocated and has now 100 elements

然后再次返回realloc调用的返回指针。

来自C标准中realloc的描述(7.22.3.5 realloc函数)

  

4 realloc函数返回一个指向新对象的指针(可能是   有(或可能没有 - 由我添加)与指向的指针相同的值   旧对象,如果新对象不能,则为空指针   分配