C 为什么我在2D数组中得到相同的地址?
最近,我在为2D数组赋值时遇到了这个问题。为了表示我的问题,我创建了小C代码。我正在使用QtCreator(community)3.3.0和MingW4.9.1 32位C 为什么我在2D数组中得到相同的地址?,c,arrays,memory-address,C,Arrays,Memory Address,最近,我在为2D数组赋值时遇到了这个问题。为了表示我的问题,我创建了小C代码。我正在使用QtCreator(community)3.3.0和MingW4.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*)&
#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;
}
您可以看到,对于不相等的数组项,有相同的地址。因此,当我为示例[1][2]赋值时,[2][0]中的值也会发生变化
请告诉我如何解决这个问题。非常感谢。您的阵列应为3x3:
double m[3][3];
或者循环应该只迭代两次,而不是三次
您现在使用的代码访问一些越界内存,导致未定义的行为。您的数组应为3x3:
double m[3][3];
或者循环应该只迭代两次,而不是三次
您现在使用的代码访问一些越界内存,导致未定义的行为。您的
条件错误。应该是i对于
条件,您有错误的。应该是i您的数组大小太小
#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[3][3];//您的数组大小太小
#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;
}
#包括
内部主(空){
double m[3][3];//您声明m[2][2]有两行2,有效索引为0和1
如果需要3x3数组,则必须声明
double m[3][3];
您将m[2][2]声明为有两行2,有效索引为0和1
如果需要3x3数组,则必须声明
double m[3][3];
i这些不是您声明的数组的有效地址。BLUEPIXY的意思是m[2][2]
是2x2矩阵,而不是3x3,因此例如m[1][2]无效,因为只有有效索引是0和1。i这些不是您声明的数组的有效地址。BLUEPIXY的意思是m[2][2]
是一个2x2矩阵,而不是3x3矩阵,因此例如m[1][2]是无效的,因为只有有效的索引是0和1。很好,谢谢。但我刚刚意识到我不了解二维数组。我在创建m[2][2]时就这么想了我可以访问idex 0、1和2。这意味着我有一个3x3数组。那么你能澄清一下它是如何工作的吗?它是从1开始工作的,而不是从0开始工作的吗?或者更好的说法是,在声明数组时,我是不是放了元素数,比如int m[元素数][元素数]?Peter It从0
开始计数,但它只有2个元素,即double m[3]
有3个元素:m[0]
、m[1]
、和m[2]
而double d[2][2]
有4个元素:d[0][0]
、d[0][1]、d[1][1]
。如果您越界访问类似于d[2][0]
的内容,这将导致未定义的行为,在您的情况下,它只是访问数组中的下一个元素d[1][0]
,但它也可能导致分段错误,甚至导致菠萝跑马拉松的动画。您可能还记得,在C类中,C中的数组是通过0到(numarayelements-1)的索引访问的。换句话说,对于定义为m[2][2]的数组,数组的有效访问偏移量为:m[0…1][0…1]很好,谢谢。但我刚刚意识到我不理解2D数组。我认为当我创建m[2][2]时,我可以访问idex 0、1和2。这意味着我有一个3x3数组。那么你能澄清它是如何工作的吗?它是从1开始工作的,而不是从0开始工作的吗?或者更好的说法是,在声明数组时,我是否要将元素的数量设置为int m[number of elements][number of elements]?@Peter它从0
开始计数,但它只有2
个元素,即double m[3]
有3个元素:m[0]
、m[1]
和m[2]
。而double d[2][code>有4个元素:d[0][0]、d[0][1]、d[1][0]
和d[1][1]
。如果您越界访问类似于d[2][0]
的内容,这将导致未定义的行为,在您的情况下,它只是访问数组中的下一个元素d[1][0]
,但它也可能导致分段错误,甚至导致菠萝跑马拉松的动画。您可能还记得,在C类中,C中的数组是通过0到(numarayelements-1)的索引访问的。换句话说,对于定义为m[2][2]的数组,数组的有效访问偏移量为:m[0…1][0…1]