C语言使用相关汇总二

C语言使用相关汇总一

13、realloc更改己经配置内存空间指令

realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。
如果将分配的内存减少,realloc仅仅是改变索引的信息。
如果是将分配的内存扩大,则有以下情况:
1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
2)如果当前内存段后面的空闲字节不够,那么就使用(由系统分配)中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。

看一下示例代码

1. #include  "stdio.h"

2. #include  "stdlib.h"

3. int main(int argc, char* argv[], char* envp[])  

4. {  

5.     int ValueInput;  

6.     int n;  

7.     int *numbers1;  

8.     int *numbers2;

9.     numbers1=NULL;  

10.   

11.     if((numbers2=(int *)malloc(5*sizeof(int)))==NULL)//为numbers2在堆中分配内存空间  

12.     {  

13.         printf("malloc memory unsuccessful");  

14.         exit(1);  

15.     }  

16.       

17.     printf("numbers2 addr: %8X\n",(int)numbers2);  

18.   

19.     for(n=0;n<5;n++) //初始化  

20.     {  

21.         *(numbers2+n)=n;  

22.         //printf("numbers2's data: %d\n",*(numbers2+n));  

23.     }  

24.     printf("Enter new size: ");  

25.     scanf("%d",&ValueInput);  

26.     //重新分配内存空间,如果分配成功的话,就释放numbers2指针,  

27.     //但是并没有将numbers2指针赋为NULL,也就是说释放掉的是系统分配的堆空间,  

28.     //和该指针没有直接的关系,现在仍然可以用numbers2来访问这部分堆空间,但是  

29.     //现在的堆空间已经不属于该进程的了。  

30.     numbers1=(int *)realloc(numbers2,(ValueInput+5)*sizeof(int));  

31.     if(numbers1==NULL) 

32.     {  

33.         printf("Error (re)allocating memory");  

34.         exit(1);  

35.     }  

36.     printf("numbers1 addr: %8X\n",(int)numbers1);  

37.       

41.   

42.      for(n=0;n<<span style="font-family: 宋体; font-size: 12px;">ValueInput;n++)//新数据初始化 

43.     {  

44.         *(numbers1+5+n)=n+5;  

45.         //printf("numbers1' new data: %d\n",*(numbers1+5+n));  

46.     }  

47.     printf("\n");  

48.     free(numbers1);//释放numbers1,此处不需要释放numbers1,因为在realloc()时已经释放  

49.     numbers1=NULL;  

50.     //free(numbers2);//不能再次释放  

51.     return 0;

52. }  

如果当前内存段后有足够的空间,realloc()返回原来的指针:

1. yugsuo@ubuntu:~/linux/memange$ gcc -g -o realloc realloc_example.c   

2. yugsuo@ubuntu:~/linux/memange$ ./realloc   

3. numbers2 addr:  8AFC008  

4. Enter new size: 10  

5. numbers1 addr:  8AFC008  

如果当前内存段后没有足够的空间,realloc()返回一个新的内存段的指针:

1. yugsuo@ubuntu:~/linux/memange$ ./realloc   

2. numbers2 addr:  9505008  

3. Enter new size: 1000000  

4. numbers1 addr:  B716F008

永不止步步 发表于12-23 09:53 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308217个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号