c 语言 realloc 源码,C语言,realloc

 2023-09-09 阅读 14 评论 0

摘要:void * realloc ( void * ptr, size_t new_size );关于realloc的行为方式,结合源码总结为:1. realloc失败的时候,返回NULL;2. realloc失败的时候,原来的内存不改变,也就是不free或不move,(这个地方很容易出错);3. 假

void * realloc ( void * ptr, size_t new_size );

关于realloc的行为方式,结合源码总结为:

1. realloc失败的时候,返回NULL;

2. realloc失败的时候,原来的内存不改变,也就是不free或不move,(这个地方很容易出错);

3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址;

假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址;

4. 如果size为0,效果等同于free();

5. 传递给realloc的指针可以为空,等同于malloc;

6. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的。

#include

#include

int main()

{

char* p1 = 1;

char* p2 = 1;

char* p3 = 1;

char* p4 = 1;

char* p5 = 1;

p1 = (char*)malloc(10);

printf("1: p1 = %x

", p1);

p2 = (char*)malloc(0);

printf("2: p2 = %x

", p2);

p3 = (char*)malloc(10);

printf("3: p3 = %x

", p3);

p4 = realloc(p1, 20);

if(p4 != 0){

printf("4: p4 = %x

", p4);

printf("4: p1 = %x

", p1);

}else{

printf("4 f: p4 = %x

", p4);

printf("4 f: p1 = %x

", p1);

}

p5 = realloc(p3, 0);

if(1){

printf("5: p5 = %x

", p5);

printf("5: p3 = %x

", p3);

}

return 0;

}

/*

1: p1 = 20a00

2: p2 = 21008

3: p3 = 20a18

4: p4 = 21410

4: p1 = 20a00

5: p5 = 21018

5: p3 = 20a18

分析:

void *malloc(size_t size);

void *realloc(void *ptr, size_t size);

1. malloc(0)成功后,返回一个非0的地址值;

2.realloc(ptr,size)成功后,返回新的地址值;ptr会被free,但这个地址值不会改变。

因此,如果使用p2 = realloc(ptr, size2)的形式,在realloc成功后,应该手动使ptr = 0,避免野指针; 如果使用ptr = realloc(ptr, size2),则不需处理。

3.realloc失败后,ptr不受影响,不会被free。

*/

参考:

1. Linux Programmer's Manualhttp://www.man7.org/linux/man-pages/man3/malloc.3.html

2. 关于realloc的调整内存方式 http://blog.csdn.net/dadoneo/article/details/8688593

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/29743.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息