我对C比较陌生,现在这让我感到困惑.它是一个更大的程序的一部分,但我写了这个小程序来描述我遇到的问题.
#includeint main() { signed int tcodes[3][1]; tcodes[0][0] = 0; tcodes[0][1] = 1000; tcodes[1][0] = 1000; tcodes[1][1] = 0; tcodes[2][0] = 0; tcodes[2][1] = 1000; tcodes[3][0] = 1000; tcodes[3][1] = 0; int x, y, c; for(c = 0; c <= 3; c++) { printf("%d %d %d\r\n", c, tcodes[c][0], tcodes[c][1]); x = 20; y = 30; }
}
我希望这个程序输出:
0 0 1000 1 1000 0 2 0 1000 3 1000 0
但相反,我得到:
0 0 1000 1 1000 0 2 0 20 3 20 30
它为分配给x和y的任何数字执行此操作.由于某种原因,x和y在内存中覆盖了数组的一部分.
有人可以解释发生了什么吗?
谢谢!
tcodes[3][0] = 1000; tcodes[3][1] = 0;
正在写两次你的数组的结尾.[3]分配时隙ID 0-2和[1]仅分配1个实际时隙[0].
将tcodes的初始化更改signed int tcodes[4][2];
为4个条目2个条目.
把它改成这个:
signed int tcodes[4][2];
其他答案是对的,但是为了帮助解释实际发生的事情:
您有以下本地声明:
signed int tcodes[3][1]; int x, y, c;
那些在内存中的堆栈帧中紧挨着存储:
tcodes
x
y
z
tcodes
有3个位置,并试图写入tcodes[n]
只是意味着找到tcodes
内存中的点并转移到第二n
个位置(我将忽略你的第二个维度,因为它只是1).如果你试着写入第3点,它将从头开始移动3个点tcodes
,即使tcodes
不是那么大.由于x
位于后面tcodes
,在该位置tcodes[3]
,内存被覆盖和x
更改的值.tcodes[4]
会覆盖y
,并tcodes[5]
会覆盖z
.如果你继续n
做大(或者说是负面的,这是合法的),你可以覆盖你在内存中允许访问的任何东西,这可能会以糟糕和难以找到的方式搞砸你的程序