C语言进阶课程学习记录-第39课 - 程序中的3个基本数据区
本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源于课程PPT,仅用于个人学习记录
栈
实验-栈空间释放后数据无效
#include <stdio.h>
int* g()
{
int a[10] = {0};
return a;
}
void f()
{
int i=0;
int b[10]={0,1,2,3,4,5,6,7,8,9};
int* pointer = g();
//case1:
// for(i=0;i<10;i++)
// {
// b[i]=pointer[i];
//
//
// }
// for(i=0;i<10;i++)
// {
// printf("%d\t",b[i]);
//
//
// }
//case2:
for(i=0;i<10;i++)
{
printf("%d\t",pointer[i]);
}
}
int main()
{
f();
return 0;
}
/*
output:
case1: 0 0 0 0 0 0 0 0 0 0
g()函数返回后,没调用其他函数,只有栈指针的数字变化了,pointer指向的内存空间的数字未更改
case2: 0 -1515052169 6356696 4202536 4202496 8 6356588 0 6356940 1979305152
g的活动记录被printf覆盖了,导致数字混乱
pointer指向的空间是没有意义的
*/
堆
静态存储区
实验-静态变量和全局变量
#include <stdio.h>
int g_v = 1;
static int g_vs = 2;
void f()
{
static int g_vl = 3;
printf("%p\n", &g_vl);
}
int main()
{
printf("%p\n", &g_v);
printf("%p\n", &g_vs);
f();
return 0;
}
/*
output:
00402000
00402004
00402008
*/
小结
程序中的3个基本数据区:栈,堆和静态存储区
栈区主要用于函数调用的使用
堆区主要用于内存的动态申请和归还
静态存储区用于保存全局变量和静态变量