为什么我在二维数组中得到相同的地址?
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<2
和 j<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];
最近我在为二维数组赋值时遇到了这个问题。为了表示我的问题,我创建了小的 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<2
和 j<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];