realloc和malloc的注意事项

https://blog.csdn.net/snlying/article/details/4005238

这篇文章缝合了几篇关于realloc和malloc的函数使用方法,之前自己也一直不太敢用realloc,现在对这篇文章进行一个提取。

realloc:

1. 

int *p, *q;
p = (int*)malloc(10);
q = p;
p = (int*)realloc(p,20);

  这里讲一下realloc扩充内存的方式。realloc试图在原有指针的后面直接扩充字节,和一般人的思维一样。因此有一种情况是realloc返回的指针和原来的指针一样,所以第四行p = p。还有一种情况就是指针后面的字节数不够了,那么realloc会在内存中再找一个地方,扩充内存,并且把原来的内容复制过来,同时原来的内存会释放掉。因此在这种情况下,第四行p会和原来的地址不相同。这对于p来说没什么,照样用,但是对于q,它指向的还是内存中的地址,所以如果操作q会有一些后果,所以最好直接把q赋值为NULL。

2.

int *p;
p = (int*)malloc(10);
p = (int*)realloc(p, 20);

  这里讲一下realloc扩充内存失败的情况。realloc失败会返回NULL,有两种情况,①p不为NULL,且size = 0,没人会这样做②如果需要扩充的内存不够,那么会返回一个NULL。这样就可以看到上述代码的问题所在了,如果返回为NULL,且没有保存原来的地址,那么原地址就没了,就会有内存泄漏。所以就最好写成上面那种代码形式,但是q赋值为NULL好了。

 

posted @ 2020-12-19 17:12  重言  阅读(172)  评论(0)    收藏  举报