【问题标题】:array overbounding using a loop?使用循环的数组越界?
【发布时间】:2015-10-23 21:43:16
【问题描述】:

好吧,所以我真的不知道在这个问题标题中添加什么,但我遇到的问题可能是一个小问题

int i;
char ch[3];

for(i=0; i<10; i++){
    ch[i] = (0x60|i)+1;
}

printf("%s %d\n", ch, i);
printf("address \n\ti %p\n\tch %p\n", &i, &ch);

输出结果是

abce 101
address 
    i 0xbfc6bd4c
    ch 0xbfc6bd49

所以我遇到的问题是为什么 letted 'd' 会被跳过

考虑了一会儿为什么字符串也会被终止,假设 int i 变量位于 ch 变量之后,i 是 4 个字节长 i 的第一个字节被字母 'e' 替换,我猜其余的这 3 个字节用 0000 0000 填充,从而导致字符串终止,这是正确的吗??

编辑

所以我似乎得到了另一个问题,为什么循环不继续并写入变量 i 的内存空间

【问题讨论】:

  • 您正在将 10 个项目写入大小为 3 的数组中。
  • @interjay 是的,我是故意的,我只是想了解事情是如何工作的,现在我想起来了,为什么 i 的其余字节也没有被替换
  • 停止故意做坏事,然后询问发生了什么。是UB,就是这样。
  • 我投票结束这个问题作为离题,因为寻求,(有意),UB解释说。
  • 我坐在一棵树的树枝上,从树干一侧锯掉它。我以为我应该在撞到地上时摔断脖子,但我惊讶地发现我只锯掉了我的腿。解释一下。

标签: c arrays


【解决方案1】:

循环在您越界后立即停止,因为当您覆盖 i 时,它不再符合循环继续的 i &lt; 10 条件。当i 为4 时会发生这种情况,它将i 的第一个字节设置为(0x60 | 4) + 1,即101。 当您打印i 时,您会看到它,因为这是int 的低位字节。

【讨论】:

  • 啊,是的,谢谢,这让我们知道为什么循环停止了
最近更新 更多