处理realloc中的指针?

时间:2014-03-31 13:22:02

标签: c realloc

请查看以下代码

char *line = (char *) malloc(100);
char *newline,*source = line;
int size=100;
newline = realloc ( line , size +=size);
// assuming that newline has been successfully assigned the demanded memory and line is           freed

现在我的问题是,我可以在将来的表达中写一下

source = newline +( line - source );

我怀疑是因为我正在使用line指针,该指针在realloc()成功运行后被释放,但我的程序(这只是它的一个片段)是

仍在使用?在line完成后使用realloc()指针是否安全?

2 个答案:

答案 0 :(得分:2)

不,在realloc完成后使用行指针是不安全的。 realloc更改line指向的块的大小。如果大小增加,则旧位置可能没有足够的连续空间来容纳新的较大块。所以块在内存中的位置会发生变化。使用realloc返回的指针 如果旧位置没有足够的空间用于用户请求的较大块,则realloc会尝试查找所需大小的新块(如malloc),复制旧块中的元素并释放旧块。 /> 如果realloc失败,则旧指针有效并且必须被释放。如果realloc成功,则旧指针被视为无效,不应被释放 此外,您的程序工作的事实并不总是检查是否正确的好方法。例如,如果您声明int a[10]并且访问a[10]a[11],则大多数情况下它可能不会失败,但它仍然是未定义的行为。

答案 1 :(得分:1)

  

使用'linepointer afterrealloc()`这样做是否安全?

不,因为realloc()可以在创建新缓冲区时释放输入缓冲区(如果新缓冲区大于之前的大小)。并且realloc会将旧缓冲区中的先前用户数据复制到新缓冲区中。因此,用户应该使用新缓冲区,因为它包含所有旧信息,而不是旧信息。

这是关于realloc()

  

void * realloc(void * p,size_t size)realloc改变了大小   p指向大小的对象。内容将保持不变   旧尺寸和新尺寸的最小尺寸。如果新的尺寸更大,那么   新空间未初始化。 realloc返回指向new的指针   空格,如果无法满足请求,则为NULL,在这种情况下* p为   不变。