Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我在2D数组中得到相同的地址?_C_Arrays_Memory Address - Fatal编程技术网

C 为什么我在2D数组中得到相同的地址?

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*)&

最近,我在为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*)&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]