请查看以下代码
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()
指针是否安全?
答案 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为 不变。