c语言字母越界,C语言内存越界的小例子

今天网上看到了一个有关C语言越界的问题。代码如下:请问输出的是什么?

#include #include int main(void){

char s[]="abcdefghijklmnopqrstuvwxyz";

char d[]="123";

strcpy(d,s);

//printf("s:%p d: %p\n",s,d);

printf("s:%s d: %s\n",s,d);

return 0;

}

部分人觉得要越界也是d越界呀,d的数据肯定不完整,我当时直觉也是这么认为的,但是实际却不是这样的,先来看下输出的是什么:

1024c1b4392579bcb892087c07c63cc1.png

我们再来打印数组s和d的地址看看d的数组越界到哪里去了?

输出结果是这样的:

b9a488b02a436572a6c55c0c39299048.png

这就可以解析了,d的地址从......10开始  ,s的地址从......20开始这中间是16个字节,就是说strcpy把s的26个字母(26个字节)复制到d的地址从0x7fffca30ef10开始到0x7fffca30ef10+27个字节占用的地址大小,那就把S的数组覆盖掉了前面10个字节,即strcpy后从0x7fffca30ef20地址开始的字母就是复制后d数组的后10个字母,即第17个字母开始,又因为strcpy复制数组会在末尾添加结束符,所以当打印输出S数组时就碰到结束符停止显示,所以最后S输出:qrstuvwxyz

最后居然知道内存越界了,那就注意分配内存空间的大小;

#include #include int main(void){

char s[]="abcdefghijklmnopqrstuvwxyz";

char d[26]="123";

strcpy(d,s);

printf("s:%p d: %p\n",s,d);

printf("s:%s d: %s\n",s,d);

return 0;

}

输出:

84117b7220e8f994902caa891dc56df5.png

这就是经常说的细节决定成败咯!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值