变量值意外变化

时间:2014-08-18 02:12:05

标签: c++

我有一个代码,应该将数据存储在一个2块数组中。

这是我的代码:

#include <iostream>
#define POSITION_DATA 1
#define X_AXIS 1
#define Y_AXIS 0

using namespace std;

typedef int dot_coordinates[POSITION_DATA];

void set_coordinates(dot_coordinates* dot,int x, int y);


int main()
{
dot_coordinates dot1,dot2,dot3,dot4;

set_coordinates(&dot1,0,0);
set_coordinates(&dot2,7,0);
set_coordinates(&dot3,0,7);
set_coordinates(&dot4,7,7);

printf("\np1 : x=%d y=%d\n",dot1[X_AXIS],dot1[Y_AXIS]);
printf("\np2 : x=%d y=%d\n",dot2[X_AXIS],dot2[Y_AXIS]);
printf("\np3 : x=%d y=%d\n",dot3[X_AXIS],dot3[Y_AXIS]);
printf("\np4 : x=%d y=%d\n",dot4[X_AXIS],dot4[Y_AXIS]);

    return 0;
}

void set_coordinates(dot_coordinates* dot,int x, int y)
{
*dot[X_AXIS] = x;
*dot[Y_AXIS] = y;
}

控制台结果如下:

p1:x = 0 y = 7

p2:x = 7 y = 0

p3:x = 0 y = 7

p4:x = 7 y = 7

对于p1,

不应该y = 7是y = 0

现在,当我更换行

时会发生什么
set_coordinates(&dot1,0,0);
set_coordinates(&dot2,7,0);
set_coordinates(&dot3,0,7);
set_coordinates(&dot4,7,7);

with(其余代码相同)

set_coordinates(&dot2,7,0);
set_coordinates(&dot3,0,7);
set_coordinates(&dot4,7,7);
set_coordinates(&dot1,0,0);

结果如下:

p1:x = 0 y = 0

p2:x = 0 y = 0

p3:x = 0 y = 7

p4:x = 7 y = 7

我一直试图理解为什么会发生这种情况,但无法弄清楚为什么p1 [X_AXIS]正在复制p2 [Y_AXIS]。 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

您已经定义了类型&#39; dot_coordinates&#39;作为长度为1的数组(通过POSITION_DATA宏)。然后,在set_coordinates函数中,索引到其第二个元素。这是未定义的行为,在这种特殊情况下,您将覆盖存储在相邻堆栈空间中的变量。

答案 1 :(得分:1)

声明数组时

int myArray[1];

那么数组的大小将是1而不是2.索引使用零计数,但不是大小。

当你在数组范围之外阅读和写作时,你的程序表现出“未定义的行为”。