正确使用Realloc

Sir*_*lot 2 c realloc

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

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

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

if(realloc(a, 100) == NULL) //Deal with the problem
Run Code Online (Sandbox Code Playgroud)

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

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

我不能这样做吗?:

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

Joh*_*ode 5

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

reallocNULL如果请求不能被满足,则可能返回(在这种情况下,原始缓冲区保留在原位).因此,您希望将返回值保存到与原始不同的指针变量.否则,您可能会覆盖原始指针,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
}
Run Code Online (Sandbox Code Playgroud)


小智 3

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

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

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