当前位置:  开发笔记 > 小程序 > 正文

为变量赋值会被存储在错误的位置吗?

如何解决《为变量赋值会被存储在错误的位置吗?》经验,为你挑选了3个好方法。

我对C比较陌生,现在这让我感到困惑.它是一个更大的程序的一部分,但我写了这个小程序来描述我遇到的问题.

#include 

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在内存中覆盖了数组的一部分.

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

谢谢!



1> Michael Dorg..:
  tcodes[3][0] = 1000;   
  tcodes[3][1] = 0; 

正在写两次你的数组的结尾.[3]分配时隙ID 0-2和[1]仅分配1个实际时隙[0].

将tcodes的初始化更改signed int tcodes[4][2];为4个条目2个条目.


并且`[1]`仅为每一行分配槽0.

2> Prine..:

把它改成这个:

signed int tcodes[4][2];



3> Michael Mroz..:

其他答案是对的,但是为了帮助解释实际发生的事情:

您有以下本地声明:

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做大(或者说是负面的,这是合法的),你可以覆盖你在内存中允许访问的任何东西,这可能会以糟糕和难以找到的方式搞砸你的程序

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有