我一直在尝试使用 for 循环来尝试迭代并打印出数组。当我尝试打印时,我得到这些随机数,但我不知道它们来自哪里。
const char segments[10][3][3] =
{
{{' ', '_', ' '}, {'|', ' ', '|'}, {'|', "_", '|'}}, // segments for 0
{{' ', ' ', ' '}, {' ', '|', ' '}, {' ', "|", ' '}}, // segments for 1
{{' ', '_', ' '}, {' ', '_', '|'}, {'|', "_", ' '}}, // segments for 2
{{' ', '_', ' '}, {' ', '_', '|'}, {' ', "_", '|'}}, // segments for 3
{{' ', ' ', ' '}, {'|', '_', '|'}, {' ', " ", '|'}}, // segments for 4
{{' ', '_', ' '}, {'|', '_', ' '}, {' ', "_", '|'}}, // segments for 5
{{' ', '_', ' '}, {'|', '_', ' '}, {'|', "_", '|'}}, // segments for 6
{{' ', '_', ' '}, {' ', ' ', '|'}, {' ', " ", '|'}}, // segments for 7
{{' ', '_', ' '}, {'|', '_', '|'}, {'|', "_", '|'}}, // segments for 8
{{' ', '_', ' '}, {'|', '_', '|'}, {' ', "_", '|'}}, // segments for 9
};
for (int k = 0; k < sizeof(segments); k++){
for(int j = 0; j < sizeof(segments); j++){
for (int i = 0; i < sizeof(segments); ++i) {
printf("%c", segments[k][j][i]);
}
}
printf("\n");
}
当我运行代码时,它会给出如下输出:
|_| �| _ |_ �| _ |_ |�| _ | �| _ |_||�| _ || �|�#�z���Z���|| �| _ |_ �| _ |_ |�| _ | �| _ |_||�| _ |_| �|�#�z���Z����|| _ |_ �| _ |_ |�| _ | �| _ |_||�| _ |_| �|�#�z���Z��� _ |_ �| _ |_ |�| _ | �| _ |_||�| _ || �|�#�z���Z���| �| _ |_ |�| _ | �| _ |_||�| _ |_| �|�#�z���Z����|| _ |_ |�| _ | �| _ |_||�| _ |_| �|�#�z���Z��� _ |_ |�| _ | �| _ |_||�| _ || �|�#�z���Z���| |�| _ | �| _ |_||�| _ |_| �|�#�z���Z���|�| _ | �| _ |_||�| _ |_| �|�#�z���Z��� _ | �| _ |_||�| _ |_| �|�#�z���Z��� | �| _ |_||�| _ |_| �|�#�z���Z����|| _ |_||�| _ |_| �|�#�z���Z���@ _ |_||�| _ || �|�#�z���Z���@�Z|||�| _ |_| �|�#�z���Z���@�Z|�| _ |_| �|�#�z���Z��� @�Z _ || �|�#�z���Z���@�Zб4|| �|�#�z���Z��� @�Z¥4Y �|
最佳答案
sizeof(segments)
获取内存中整个数组的大小,而不是其任何轴的长度。
根据 this question 的最佳答案,您仍然可以使用 sizeof
,只需在数组的不同部分使用它:要获取每个轴的长度,请将其总长度除以其元素之一的长度。
some_type_t const array[I][J][K] = ARRAY_INITIALIZER;
// array size over size of subarray
size_t const i_max = sizeof(array) / sizeof(array[0]);
// subarray size over size of sub-sub-array
size_t const j_max = sizeof(array[0]) /
sizeof(array[0][0]);
// sub-sub-array size over size of one element
size_t const k_max = sizeof(array[0][0]) /
sizeof(array[0][0][0]);
for (size_t i = 0; i < i_max; ++i) {
for (size_t j = 0; j < j_max; ++j) {
for (size_t k = 0; k < k_max; ++k) {
// do something with array[i][j][k]
}
}
}
根据相同的答案,您可以使用以下宏自动生成这些表达式。
#define NELEMS(x) (sizeof(x) / sizeof((x)[0])) int a[17]; size_t n = NELEMS(a);
为什么有效
您可能期望 sizeof(array[0])
在零长度数组上失败,这可能会让您犹豫是否使用它。但别担心——这应该适用于任何(非可变长度)数组。
第 80 页,共 this draft C 标准描述了 sizeof
运算符的工作原理:
如果给 sizeof
除了可变长度数组之外的任何东西,它不会计算它 - 编译器可以找出操作数有多大,并且只使用该值。
因此,在上面的示例中定义 array
后,编译器知道 array
的任何元素都具有类型“length-J array长度为 K 的 some_type_t
数组”(换句话说,some_type_t[J][K]
)。它还知道J和K的值,因为它们需要是内联常量,所以它可以确定数组的任何元素有多大。
因此,使用什么索引来查找元素的大小并不重要,只要它是整数即可。 sizeof(array[0])
可以很好地处理空数组,sizeof(array[-1])
或 sizeof(array[124124] )
(尽管你应该始终使用 0 以避免混淆)。
事实上,标准草案甚至用它作为例子:
- EXAMPLE 2 Another use of the
sizeof
operator is to compute the number of elements in an array:sizeof array / sizeof array[0]
如果标准建议这样做,那么这可能是一个很好的方法。
关于c - 迭代 3d 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58458833/