2014-03-31 55 views
0

请看下面的代码处理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指针a过去realloc()已经完成了吗?

+0

错误:应该是char * newline,* source = line;' – avmohan

+0

'newline +(line + 10)'不会编译,它试图将两个指针加在一起。 – interjay

回答

1

so is it safe to use 'linepointer afterrealloc()` has done?

没有,因为realloc的()可以释放你的输入缓冲器,同时使新的(如果有新的人比以前的尺寸)。并且realloc会将之前的用户数据从旧的缓冲区复制到新的缓冲区中。所以用户应该使用新缓冲区,因为它包含所有旧信息而不是旧信息。

这是关于realloc()的

void *realloc(void *p, size_t size) realloc changes the size of the object pointed to by p to size. The contents will be unchanged up to the minimum of the old and new sizes. If the new size is larger, the new space is uninitialized. realloc returns a pointer to the new space, or NULL if the request cannot be satisfied, in which case *p is unchanged.

2

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