C语言方式内存管理与操作
具体实现代码如下:要是写的不好与不对欢迎指出:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
代码位于:代码段,可用相应的函数查看其内部定义函数的入口地址,SHW_ADR("函数名",函数名)
查看数据段段变量的地址与bss段变量的:也用SHW_ADR(”变量名“,变量名),也就是说用此函数可以查看相应的函数与变量的位置
1、代码区:存放代码
2、全局初始化数据/静态数据区:存放已初始化的全局变量和静态变量
2、未初始化数据区或叫BSS区:存放的是未初始化的全局变量与未初始化的变量
3、栈区:由编译器自动分配,存放函数局部变量值等,用于函数压栈等。
4、堆区:用于动态内存分配,位于bss区和栈区之间一般用macolla分配。
以上为代码段、数据段、堆栈段更加详细的分类。
对于一个可执行文件可用size 文件名 查看各个段的大小,file 文件名 可查看文件的状态及编译方式及环境等。
要看一个程序的内存是否异常,如数组越界,空间被释放还去访问等问题,可在编译程序的时候加入相应的参数即可,及用工具查看
*/
int main(int argc,char *argv[])
{
int num;
int *arry;
int len=10; //申请相关数据类型数据的个数
//malloc 与 free测试
if((arry=(int *)malloc(len*sizeof(int)))==NULL)//申请成功后返回指针地址
{
perror("malloc");
exit(EXIT_FAILURE);//申请不成功退出程序
}
memset(arry,0,len*sizeof(int));//申请的内存初始化
for(num=0;num<10;num++,arry++)//注意此处的arry地址,最后一次自加器相应的存储空间没有被赋值
{
*arry=num; //注意运算符的优先级
printf("%4d ",*arry);
printf("%4d\n",(int)arry);
} //num加了10次,arry也加了10次,加上原本就返回的一个地址一个为10个,所以须得注意最后结果,最后一次是不合法的地址空间
for(num=9;num>=0;num--)
{
arry--;//由上面的赋值处自驾可知,一来必须先给予相应的地址自减,使其到达有效地址空间
printf("%4d ",*arry);
printf("%4d\n",(int)arry);
}
printf("\n");
free(arry);
arry=NULL;
//realloc 函数的使用
if((arry=(int *)realloc(arry,len*sizeof(int)))==NULL)
{
perror("realloc");
exit(EXIT_FAILURE);
}
memset(arry,0,len*sizeof(int));//申请的内存初始化
for(num=0;num<10;num++,arry++)*arry=num*2;
for(num=9;num>=0;num--)
{
arry--;//由上面的赋值处自驾可知,一来必须先给予相应的地址自减,使其到达有效地址空间
printf("%4d ",*arry);
printf("%4d\n",(int)arry);
}
free(arry);
arry=NULL;//避免成为野指针,既无方向的指针
//以上的malloc realloc ,calloc都为向堆去申请空间故需要用free函数释放内存
//以下为alloca 为向栈区申请空间,该函数自动把这部分空间自动初始化为0,切不用调用free函数释放内存
//须得注意的是不管是用哪个函数申请的空间都需的注意其返回值,一般情况须得度返回值进行强制转换为所需类型
if((arry=(int *)alloca(len*sizeof(int)))==NULL)//此处不必强制转换,在栈去申请的直接付给指针变量即可
{
perror("alloca");
exit(EXIT_FAILURE);
}
printf("alloc test start\n");
for(num=0;num<10;num++,arry++)*arry=num*3;
for(num=9;num>=0;num--)
{
arry--;//由上面的赋值处自驾可知,一来必须先给予相应的地址自减,使其到达有效地址空间
printf("%4d ",*arry);
printf("%4d\n",(int)arry);
}
exit(0);
return 0;
}
要看自己程序的内存管理是否有问题则在编译程序时加入相应的内存管理查看工具即可。