C典型错误

#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的位置。
---------------------------------------
局部变量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。这是它原文的解析。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值