综述
C语言程序中,代码是放在内存中执行的,我们大致将程序所占用的内存分为四个区域:栈区 堆区 全局区 代码区 每个程序都有唯一 一个内存四区,我们应该掌握各个区域的特性,例如存储哪种类型的数据,由谁去申请开辟,又由谁去管理释放等等。
1.栈区
//栈区 非法操作内存
char *getMem2()
{
char buf[64];//栈区
strcpy(buf,"123456");//"12345"放在全局区
return buf; //在return时被回收 返回的是buf的首地址 但该地址已经不属于buf了
}
int main()
{
char *tmp = NULL;//栈区
tmp = getMem2();
printf("tmp2:%s.\n",tmp);//每次运行结果都不同 该地址保存的内容 不是buf保存的
return 0;
}
2.堆区
//堆区
char *getMem1(int num)
{
char *buf = NULL;//栈区
buf = (char *)malloc(sizeof num);//申请堆空间
if(buf == NULL)
{
return NULL;
}
return buf;//在程序结束后由操作系统回收 函数执行完该空间还在
}
int main()
{
char *tmp = NULL;//栈区
tmp = getMem1(10);
if(tmp == NULL)
{
return ;
}
strcpy(tmp,"123");"字符串写到堆空间"
printf("tmp1:%s.\n",tmp);//固定结果 123
}
3.全局区
#include<stdio.h>
char *getstr1()
{
char *t1 = "qwe2";
return t1;
}
char *getstr2()
{
char *t2 = "qwe2";//换成qwe1再运行一下
return t2;
}
int main()
{
char *p1 = NULL;
char *p2 = NULL;
p1 = getstr1();
p2 = getstr2();
//当 getstr1和getstr2 所指向的不同 会有不同的结果
printf("p1:%s\tp2%s\n",p1,p2);
printf("p1:%d\tp2:%d\n",p1,p2);
return 0;
}
解释:
在getstr1和getstr2所指向的内容相同时,在全局区只保存一次,打印出的内容和地址都相同.
在getstr1和getstr2所指向的内容不同时,全局区分别保存,打印出的地址可能相邻,也可能随机.