在C/C++程序中一般有一下存储区:
1.栈,由编译器自动分配释放,一般指函数内部的存储空间。
2.堆,由程序员手动分配释放,若未释放,程序结束时会被由OS回收
代码中通过new/malloc/relloc等显示申请的内存都属于堆上,这些内存需要手动的去free/delete
3.静态存储区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
4.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
在学习C语言的时候,绝大部分教材里一定会降到声明变量的时候需要初始化。
int a;
printf("%d", a); //此时的输出就可能是一个随机值。
看一个例子:
void f() {
int a = 1;
printf("address %p:%d", &a, a);
}
void g() {
int a ;
printf("address %p:%d", &a, a);
}
int main() {
f();
g();
return 0;
}
结果输出:
address0x7fffbf281ea4:1
address0x7fffbf281ea4:1
为什么两个a的地址一样?
f和g两个函数内的a都是栈上的空间,f()执行完后,那块栈上空间,已经被回收,标记为可用了。然后调用g(),g和f的大小是一样的,没出意外的话,g的栈地址还是从上次f的那块开始,所以a地址一样的。
为什么两个a的值一样?
栈空间被回收了,只是表示那块地址可以被使用,但地址里的内容,系统可不否则维护,在你释放了后去檫除,所以g中的a指向了上次a的那块地址,内容还是那块内容。所以a的值还是1。
这就是变量初始化的意义。
网友评论