堆 栈

1.栈一般比较小,几十兆,但递归太多,局部变量太大栈会溢出
2.例子
int a[100]; for(int i = 0;i<100;i++) a[i] = 99; print("%d-%d-%d-%d-%d");
程序的输出结果是:0-0-0-99-99
解释:前面三个0不知道为什么,后面的两个99是输出了数组a的两个元素,随着程序的运行,局部变量被放入栈中,

执行到print时,格式字符串"%d-%d-%d-%d-%d"
需要五个整数参数,从printf四个字节四个字节处往下找,在这次运行中,前三个参数在内存空间中刚好表示为0,第四和第五个参数找到了数组a中的元素。很幸运没有出错。。
下面看一个正常点的输出语句:
int a = 99; printf("%d",n);
程序运行完printf语句后在对应的内存空间中是这样的

补充一点:c语言中的字符串就是字符数组,格式字符串的指针指向存放“%d”字符数组的内存空间
程序将printf函数中的第二个参数n的数值复制存放在栈中(当有多个参数的时候,根据栈后进先出的顺序存放到栈中),本例子是99,然后根据格式字符串向下取数据,就把99取了出来,输出。

浙公网安备 33010602011771号