我有一个代码,应该将数据存储在一个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]。 任何帮助将不胜感激!
答案 0 :(得分:3)
您已经定义了类型&#39; dot_coordinates&#39;作为长度为1的数组(通过POSITION_DATA宏)。然后,在set_coordinates函数中,索引到其第二个元素。这是未定义的行为,在这种特殊情况下,您将覆盖存储在相邻堆栈空间中的变量。
答案 1 :(得分:1)
声明数组时
int myArray[1];
那么数组的大小将是1而不是2.索引使用零计数,但不是大小。
当你在数组范围之外阅读和写作时,你的程序表现出“未定义的行为”。