c语言数组下标负一,新手上路,关于C语言数组下标问题跪求!

9e8a8a1d2131a4d36c865ca39c2cec10.png

缥缈止盈

越界了,undefinedbehavior。你这个代码中,都是在栈上分配的,栈是高位往低位扩张,一开始栈的布局是这样的a9a8a7a6a5a4a3a2a1a0每次loop,会在低位申请然后又释放i,栈的布局:a9a8a7a6a5a4a3a2a1a0i这种情况下arr[-1]就会一直输出i这里有个小问题,我在wsl上试着是4个字节,而在mac是两个字节,但mac上的整型也是4个字节,不知道为什么这儿就变成两个字节了)我猜你计算2和4是代码里面输出两个地址相减的值的。你的wsl应该是默认编译出32位的程序,直接减得到4没问题。mac上编译出来的是64位的,你直接减,然后输出的时候应该是溢出了,得到个2,你试试先把地址转longlong,用%lld输出试试,会得到一个8,而不是2或者4。这是因为分配空间的时候还会做内存对齐,分配i的时候会再跳过高位的4个字节再去分配i,保证i的地址也是8的倍数,所以实际地址差是8,64位的程序堆结构大概如下:0a8a7a6a5a4a3a2a1a00i贴一个gdb的输出//codeinta[]={1,2,3,4,5,6,7,8,9};inti=2;//gdbp&i(int*)$1=0x00007ffeefbffdc8x/11dw0x00007ffeefbffdc80x7ffeefbffdc8:20x7ffeefbffdcc:00x7ffeefbffdd0:10x7ffeefbffdd4:20x7ffeefbffdd8:30x7ffeefbffddc:40x7ffeefbffde0:50x7ffeefbffde4:60x7ffeefbffde8:70x7ffeefbffdec:80x7ffeefbffdf0:9

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值