主要内容
常量区 静态区 栈 堆 对应的分配空间的作用域的范围
常量字符串的内存空间由系统自动分配 , 在常量区里面分配,当程序结束才会被释放,常量区 - 常量 const int a = 1;
静态区 - static
栈 - 局部变量 int a = 10;离开作用域就自动收回
堆 - 自己申请的内存空间 malloc calloc realloc, 必须自己释放
常量区
#include <stdio.h>
char * test(){
char * name = "jack";
return name;
}
int main(){
char * p;
p = test();
printf("--%s\n", p);
return 0;
}
注:常量字符串的内存空间由系统自动分配,在常量区里面分配,当程序结束后才会被释放。
在上方代码块中,“Jack”即为字符串常量,由系统自动分配内存,在程序结束后内存才会被释放;而指针name属于局部变量,只在test函数中起作用,出test函数后,它的内存被释放掉。
栈
#include <stdio.h>
char *test1(){
char name[10] = {'j','a','c','k'};
return name;
}
int main(){
char * p;
p = test1();
printf("--%s\n", p);
return 0;
}
注:由于数组name属于局部变量,在出了test1函数之后,内存被释放,指针p此时指向的地址为空,此时指针p为野指针
静态区
静态变量->只会被定义一次,生命周期:从程序开始到结束
例子:记录一个函数被调用的次数
#include <stdio.h>
//int count = 0;//全局变量(当前文件而言的全局)
void test3(){
//静态变量 - 只会被定义一次;
//生命周期:从程序开始到结束
static int count = 0;
count++;
printf("count:%d\n",count);
}
int main(){
test3();
test3();
test3();
return 0;
}