这是我被教导使用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
答案 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函数返回一个指向新对象的指针(可能是 有(或可能没有 - 由我添加)与指向的指针相同的值 旧对象,如果新对象不能,则为空指针 分配