用C语言编写的程序在内存中运行时,内存被分配为5个区:
1堆区。动态分配内存区,即程序运行时被用户申请的空间,而非程序自身分配的内存;2栈区。用来存放程序运行时的局部变量;
3ESS段。存放未被完全初始化的全局变量和静态变量。4数据区。存放完全初始化的全局变量和静态变量,字符串。
5代码区。编译后的代码。
当用户遇到需要临时申请内存空间时,可以使用内存分配函数malloc(),calloc(),realloc()。它们的使用方式及作用如下:
1void * malloc(num);num为内存段长度,如malloc(100)表示申请一段长度为100字节的内存长度;
2void * calloc(count,num);count表示申请的内存段个数,num表示每个内存段的长度,如calloc(4,sizeof(int))表示申请4段长度为int(4)个字节的内存长度;
3void * realloc(p,num);p表示内存首地址,num表示内存长度,如char *p = ''abc';realloc(p,10);表示在首地址为p的内存处开辟一段长度为10的内存空间,当原来的p地址处后面的空白内存不够10个长度的时候,系统就会开辟新的长度为10的内存空间,原来的字符串abc也会被移动到新的内存空间处。
下面是一个关于内存分配函数的应用
#include <stdio.h>
//常见内存分配函数的应用
#include <stdlib.h>
char * ch()
{
char *p = (char *)malloc(100);
if(p != NULL )//申请长度为100的内存空间
{
p = (char *)malloc(100);
p = "abc";
}
return p;
}
int main(int argc, char* argv[])
{
char *p = ch();
printf("%s\n",p);
return 0;
}