Chinaunix首页 | 论坛 | 博客
  • 博客访问: 536669
  • 博文数量: 139
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-11 22:40
文章分类

全部博文(139)

文章存档

2011年(1)

2009年(3)

2008年(135)

我的朋友

分类: C/C++

2008-05-16 11:26:22

#include
#include

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。这是它原文的解析。
阅读(849) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~