首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用Realloc

正确使用Realloc
EN

Stack Overflow用户
提问于 2017-06-28 04:27:36
回答 4查看 3.3K关注 0票数 5

这是我学到的使用realloc()的方法

代码语言:javascript
复制
int *a = malloc(10);
a = realloc(a, 100); // Why do we do "a = .... ?"
if(a == NULL) 
//Deal with problem.....

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

代码语言:javascript
复制
if(realloc(a, 100) == NULL) //Deal with the problem

与我在周围找到的其他realloc示例相同,例如:

代码语言:javascript
复制
int *oldPtr = malloc(10);
int * newPtr = realloc(oldPtr, 100);
if(newPtr == NULL) //deal with problems
else oldPtr = newPtr;

我不能这样做吗?:

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

发布于 2017-06-28 05:07:02

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

如果请求不能被饱和(在这种情况下,原始缓冲区保留在原地),则realloc可能会返回NULL。因此,您希望将返回值保存到与原始指针变量不同的指针变量中。否则,您可能会用NULL覆盖原始指针,并丢失对该缓冲区的唯一引用。

示例:

代码语言:javascript
复制
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
}
票数 9
EN

Stack Overflow用户

发布于 2017-06-28 04:39:03

调用realloc的正确方法是将返回值保存在临时变量中,并检查返回值是否为NULL。这样即使realloc失败了,你也不会失去原来的记忆。例如:

代码语言:javascript
复制
int *a, *b;
a = malloc(10); 
b = realloc(a, 100);
if (b == NULL) {
    // handle error and exit
}
a = b;

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

票数 4
EN

Stack Overflow用户

发布于 2017-06-28 04:38:39

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

因此,正确的解决方案是您的第三个示例。

代码语言:javascript
复制
int *oldPtr = malloc(10);
int * newPtr = realloc(oldPtr, 100);
if(newPtr == NULL) //deal with problems
else oldPtr = newPtr;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44789295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档