#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i = 5;
char buff[4];
strcpy(buff, "abcd");
printf("%d/n", i);
return 0;
}
输出的结果是0, 只知道是堆栈方面的问题, 但是怎么会出现这样的结果?
栈溢出。
abcd后面的'/0',直接填充了i的位置。
#include <string.h>
int main(int argc, char *argv[])
{
int i = 5;
char buff[4];
strcpy(buff, "abcd");
printf("%d/n", i);
return 0;
}
输出的结果是0, 只知道是堆栈方面的问题, 但是怎么会出现这样的结果?
栈溢出。
abcd后面的'/0',直接填充了i的位置。
---------------------------------------
局部变量i和函数内的数组buff都是分配在栈空间内的。这里栈分配了4个char大小的空间给buff,紧跟着i。注意栈的增长是由高到低的。
字符串“abcd”事实上是有5个字符的,'a','b','c','d','/0'的。看strcpy的实现,可以知道把这五个字符copy到以buff为首地址的空间。而buff的大小是4个字符的,多出的'/0'字符就覆盖了buff+4的空间内容。从栈的增长看出,i是刚好紧跟着buff的,所以'/0'就覆盖了i的原值。
----------------------------------------
栈分配i空间,紧跟分配4个char大小的空间给buff
由于栈的增长方向是由高到低的,比方说i的地址为0x1245,则buff【0】为0x1241,buff【1】为0x1242,buff【2】为0x1243,buff【3】为0x1244。这是它原文的解析。
本文通过一个简单的C语言程序示例,详细解释了栈溢出的原因及过程。当局部数组越界写入时,如何覆盖相邻变量,导致程序行为异常。

被折叠的 条评论
为什么被折叠?



