C语言内存越界的小例子

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

#include <stdio.h>
#include <string.h>

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的数据肯定不完整,我当时直觉也是这么认为的,但是实际却不是这样的,先来看下输出的是什么:

 

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

输出结果是这样的:

 

这就可以解析了,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 <stdio.h>
#include <string.h>

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;
}

输出:

  

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值