我一直在尝试使用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�|
答案 0 :(得分:2)
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])
在零长度数组上失败,这可能会让您犹豫使用它。但请放心,这对任何(非可变长度)数组都适用。
C标准this draft的第80页描述了sizeof
运算符的工作方式:
如果sizeof
除了可变长度数组之外还提供其他任何内容,它就不会对其进行求值-编译器可以找出操作数的大小,并且仅使用该值。
因此,在上例中定义了array
之后,编译器知道array
的任何元素的类型都是“ length- J 长度为<< em>的数组some_type_t
”(即some_type_t[J][K]
)的K 数组。它还知道 J 和 K 的值,因为它们需要是内联常量,因此可以确定数组中任何元素的大小。
因此,使用什么索引查找元素的大小都没有关系,只要它是整数即可。 sizeof(array[0])
可以与空数组配合使用,就像sizeof(array[-1])
或sizeof(array[124124])
一样(尽管您应始终使用0以避免混淆人们)。
事实上,标准草案甚至以它为例:
- 示例2
sizeof
运算符的另一用途是计算数组中元素的数量:sizeof array / sizeof array[0]
如果标准建议这样做,那可能是一种很好的方法。