c语言中的动态内存分配

来源:互联网 发布:禁酒令 知乎 编辑:程序博客网 时间:2024/04/29 11:27

动态内存分配是在堆上开辟空间,当我们用malloc分配一个空间得到空间返回地址,而当我们想扩大空间时,用realloc返回的地址却不一定是原来的地址,这牵涉到内存的分页问题,例如:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include<stdlib.h>
  4 void main()
  5 {
  6    char *p1,*p2;
  7         p1=(char*)malloc(18);
  8         p2=(char*)malloc(18);
  9         printf("p1=%p\tp2=%p\n",p1,p2);
 10         strcpy(p1,"hello world");
 11         strcpy(p2,"helloworld");
 12         p1=(char*)realloc(p1,1024);
 13         p2=(char*)realloc(p2,10);
 14 
 15    printf("p1=%p\tp2=%p\n",p1,p2);
 16 
 17 }

运行结果:

     p1=0x8784008 p2=0x8784020 

      p1= 0x8784038p2=0x8784020    

     由结果可以看出p1地址和源地址不同。此时,系统会自动在堆上开辟新的内存空间,并把原空间的内容拷贝到新的空间,并释放旧的空间,返回新空间首地址;

而p2由于在原空间上扩张的空间能在内存上得到,可以直接扩充,返回原地址。

0 0
原创粉丝点击