为什么该程序打印0而不是指定数组中的特定值集? [重复]

问题描述 投票:0回答:5
我想知道为什么这个小程序中的printf函数返回0而不是数字数组3 2 2

int main(){ int mat[2][2][2] = {{3,1,1},{2,2,2}}; printf("first x, 2nd y, 2nd z = %d\n",mat[0][1][1]); }

虽然在C中使用X by Y矩阵在C中检索任何值XxY都是一件轻而易举的事,但是一旦我添加了另一个维度,便遇到了这个问题。我想我一定对C处理数组中的坐标的方式有误解。非常感谢!
c arrays multidimensional-array initialization initializer-list
5个回答
1
投票
输入

int mat [2] [2] [2] = {{3,1,1},{2,2,2}};

您声明了一个3D数组,但您为2D进行了初始化,值未放置在您期望的位置

#include <stdio.h> int main(){ int mat[2][2][2] = {{3,1,1},{2,2,2}}; for (int i = 0; i != 2; ++i) for (int j = 0; j != 2; ++j) for (int k = 0; k != 2; ++k) printf("%d %d %d -> %d\n", i, j, k, mat[i][j][k]); return 0; }

执行:pi @ raspberrypi:/ tmp $ ./a.out

0 0 0 -> 3 0 0 1 -> 1 0 1 0 -> 1 0 1 1 -> 0 1 0 0 -> 2 1 0 1 -> 2 1 1 0 -> 2 1 1 1 -> 0 pi@raspberrypi:/tmp $

此外,因为您的数组有8个

int,但是init值只有6个,因此编译器将0初始化为两个未指定的条目


1
投票
问题是此数组元素mat[0][1][1]没有显式的初始化程序。因此它被初始化为零。

然后您有这样的声明

int mat[2][2][2] = {{3,1,1},{2,2,2}};

然后,数组mat [0]的第一个元素作为集合由该列表{3,1,1}初始化,而数组mat [1]的第二个元素由该列表{2,,2初始化。 2}。

关于元素mat [0]的元素,这些元素又没有指定大括号,那么mat [0]的元素将依次初始化,如

mat[0][0][0] = 3 mat[0][0][1] = 1 mat[0][1][0] = 1

元素(数组)mat [0]的所有其他元素初始化为零。

这里是演示程序。

#include <stdio.h> int main(void) { int a[2][2][2] = {{3,1,1},{2,2,2}}; printf( "%d, %d, %d\n", a[0][0][0], a[0][0][1], a[0][1][0] ); printf( "%d, %d, %d\n", a[1][0][0], a[1][0][1], a[1][1][0] ); return 0; }

其输出为

3, 1, 1 2, 2, 2


0
投票
此代码将为您提供为什么结果为0

int main(){ int mat[2][2][2] = {{3,1,1},{2,2,2}}; for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) for(int k = 0; k < 2; k++) printf("mat[%d][%d][%d] = %d \n", i, j, k, mat[i][j][k]); return 0; }

输出:

mat[0][0][0] = 3 mat[0][0][1] = 1 mat[0][1][0] = 1 mat[0][1][1] = 0 mat[1][0][0] = 2 mat[1][0][1] = 2 mat[1][1][0] = 2 mat[1][1][1] = 0

当您声明:

int mat[2][2][2] = {{3,1,1},{2,2,2}};

这意味着您在程序中使用的是2D数组,而不是3D。

0
投票
您有一个三维数组,但是您正在初始化一个带有1个额外值的2级数组。考虑类似的东西:

#include <cstdio> int main(){ int mat[2][2][2] = { {{3, 3}, {1, 1}}, {{1, 1}, {1, 1}} }; printf("first x, 2nd y, 2nd z = %d\n", mat[0][1][1]); }


0
投票
您指定了一个具有三个维度的数组,但仅指定了两个。此外,每个元素应该有两个条目,但您有三个。

如果您turn on warnings,您应该看到类似以下的警告:

test.c:4:26: warning: suggest braces around initialization of subobject [-Wmissing-braces] int mat[2][2][2] = {{3,1,5},{2,2,2}}; ...more like that... test.c:6:44: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat] printf("z for first coordinate = %d\n",mat[0][2]); ~~ ^~~~~~~~~ test.c:6:44: warning: array index 2 is past the end of the array (which contains 2 elements) [-Warray-bounds] printf("z for first coordinate = %d\n",mat[0][2]); ^ ~ test.c:4:5: note: array 'mat' declared here int mat[2][2][2] = {{3,1,5},{2,2,2}}; ^

int mat[2][2][2]会像这样初始化。

int mat[2][2][2] = { { {3,1}, {1,1}, }, { {1,1}, {2,2}, } };

您将永远不会从3 2 2中获得mat[0][1][1]。它只会返回单个值。在这种情况下,1。


如果要存储2个3D坐标的列表,请改用[2] [3]。

int mat[2][3] = {{3,1,1},{2,2,2}};

询问第一个x和第二个y的z是没有意义的。这就像问新泽西州丹佛市的高度是多少(丹佛在科罗拉多州)。第一个x和第二个y是两个不同坐标的一部分,并且具有不同的z。

相反,您可以像这样获得第一个坐标的z。

printf("z for first coordinate = %d\n",mat[0][2]);

第一个坐标为mat[0],其z为第三个属性,即第二个索引。 mat[0][2]
© www.soinside.com 2019 - 2024. All rights reserved.