大家都知道字符串不能超出定义的长度,那么这是为什么呢?
编译与字符串
本次总结将用编译原理的知识来解释其中的原理。
首先,程序编译时,函数编译将产生一个栈,
栈按从高地址到低地址的顺序入栈,在函数参数、返回地址等入栈后,局部变量入栈。假设有字符数组
char str[4];
而后给它赋值有
str="12345678";
这个字符串"12345678"共有8个字节,而我们定义时只有4个字节,那么多出的4个字节将会往下存储,覆盖掉底下的控制链,就会出错,但是仍然能够返回调用函数继续执行语句,原因就在于,此时返回地址并没有被覆盖。这就是为什么有时候数组溢出仍能输出执行,而有时候就不行。