为什么我在二维数组中得到相同的地址?

Why do I get same addresses in 2D array?

最近我在为二维数组赋值时遇到了这个问题。为了表示我的问题,我创建了小的 C 代码。我正在使用 QT Creator(社区)3.3.0 和 minGW 4.9.1 32 位。

#include <stdio.h>
int main(void){
double m[2][2];
for (int i = 0 ; i<3; i++){
    for(int j=0; j<3; j++)
         printf("%p[%d][%d]     ", (void*)&m[i][j],i,j);
    printf("\n");
 }
return 0;
}

作为输出,我得到内存地址

0028FE98[0][0]     0028FEA0[0][1]     0028FEA8[0][2]
0028FEA8[1][0]     0028FEB0[1][1]     0028FEB8[1][2]
0028FEB8[2][0]     0028FEC0[2][1]     0028FEC8[2][2]

你可以看到不相等的数组项有相同的地址。因此,当我为 [1][2] 赋值时,[2][0] 中的值也会发生变化。

请给我任何关于如何解决这个问题的建议。非常感谢。

你的数组应该是 3x3:

double m[3][3];

或者你的循环应该只迭代两次,而不是三次。

您现在的代码访问了一些越界内存,导致未定义的行为。

您的 for 条件有误。应该是 i<2j<2。试试吧,你会发现一切都会好的。

为什么指针相同?因为内存中的table(1d,2d,3d无所谓)是一个内存块。所有维度都是 "in one line",当你写这样的东西时

double tab[2][2];

tab[0][1] = 1; // that's the same as *(tab + 0*sizeof(double)*2 + 1*sizeof(double)) = 1;
tab[1][1] = 2; // that's the same as *(tab + 1*sizeof(double)*2 + 1*sizeof(double)) = 2;

所以你可以看到你有这个

double m[2][2];

m[1][2]  // that's the same as (m + 1*sizeof(double)*2 + 2*sizeof(double)) => (m + 4*sizeof(double)) ;
m[2][0]  // that's the same as (m + 2*sizeof(double)*2 + 0*sizeof(double)) => (m + 4*sizeof(double));

这就是相同指针的原因

你的数组太小了。

#include <stdio.h>
int main(void){
double m[3][3]; // <------ Change size to 3,3
for (int i = 0 ; i<3; i++){
    for(int j=0; j<3; j++)
         printf("%p[%d][%d]     ", (void*)&m[i][j],i,j);
    printf("\n");
 }
return 0;
}

您声明 m[2][2] 有 2 行 2,有效索引为 0 和 1 如果你想要一个 3x3 数组,你必须声明

double m[3][3];