C 语言的内存分配方式
- 从静态存储区分配:内存在程序编译期间分配;这块内存在程序这个运行期间都存在。例如:全局变量、static 变量;
- 从栈上分配:内存在编译期间分配;例如函数内的局部变量,函数执行结束,内存自动释放;栈内容效率高,容量有限;
- 从堆上分配(或称之为动态内存分配):在运行期间分配,需要手动申请(使用 malloc 或 new)手动释放(使用free或delete);动态内存的生存周期由用户决定;
C 语言中与内存申请相关的函数
alloca:向栈申请内存,系统自动释放;void* malloc(unsigned size):向堆申请内存,没有堆内存进行初始化,一般用memset来初始化;void* calloc(size_t numElements, size_t sizeOfElement):向堆申请内存,并初始化为 0;void* realloc(void* ptr, unsigned newsize):对molloc申请的内存进行大小调整;如果是对内存进行扩大,会优先在原来内存的基础之上进行扩大;如果原来的地址空间不足,会使用堆山第一个足够大小的空间,并返回该空间的地址;
上述内存分配函数的头文件为 molloc.h。
查看 malloc 和 realloc 分配内存的地址:
- 返回地址相同的情况
#include <stdio.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
char *addr1, *addr2;
addr1 = (char *)malloc(10);
addr2 = (char *)realloc(addr1,11);
printf("addr1 = 0x%x/n",addr1);
printf("addr2 = 0x%x/n",addr2);
return 0;
}
结果:地址不变:
addr1 = 0x431a70
addr2 = 0x431a70
- 返回地址不相同的情况
#include <stdio.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
char *addr1, *addr2;
addr1 = (char *)malloc(10);
addr2 = (char *)realloc(addr1,1000);
printf("addr1 = 0x%x/n",addr1);
printf("addr2 = 0x%x/n",addr2);
return 0;
}
结果:地址不同
addr1 = 0x351c0
addr2 = 0x431a70
版权声明:本文为zhi_neng_zhi_fu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。