我是C语言的新手,这让我很困惑。它是一个更大的程序的一部分,但是我编写了这个小程序来描述我所遇到的问题。

#include <stdio.h>

int 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覆盖了内存中数组的各个部分。

有人可以解释发生了什么吗?

谢谢!

最佳答案

其他答案是正确的,但有助于解释实际情况:

您具有以下本地声明:

signed int tcodes[3][1];
int x, y, c;

那些紧挨着存储在内存中的堆栈帧中:


tcodes有3个斑点,尝试写tcodes[n]只是意味着找到tcodes指向内存中的位置,然后移至n th斑点(我将忽略您的第二维,因为无论如何它只是1维)。如果您尝试写入第3点,即使tcodes没那么大,它也将从tcodes的开头移到3个点。由于x位于tcodes之后,因此tcodes[3]就在其中,该内存将被覆盖,并且x的值将更改。 tcodes[4]将覆盖y,而tcodes[5]将覆盖z。如果您继续增加n的大小(或为负数,这是合法的),则可能会覆盖您允许在内存中访问的所有内容,这可能会以不良且难以发现的方式破坏程序

09-30 13:07