c - 迭代 3d 数组

标签 c arrays

我一直在尝试使用 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长度为 Ksome_type_t 数组”(换句话说,some_type_t[J][K])。它还知道JK的值,因为它们需要是内联常量,所以它可以确定数组的任何元素有多大。

因此,使用什么索引来查找元素的大小并不重要,只要它是整数即可。 sizeof(array[0]) 可以很好地处理空数组,sizeof(array[-1])sizeof(array[124124] ) (尽管你应该始终使用 0 以避免混淆)。

事实上,标准草案甚至用它作为例子:

  1. 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/

相关文章:

c - 异步返回尚未完全 "set up"(或已处理)的结果(作为结构)的最佳方法是什么

c - 在 C 中使用非阻塞套接字连接

c# - 初始化 KeyValuePair 数组

javascript - javascript 中强类型容器的更好选择

c# - 在 C# 中检索软电话中的音频编解码器使用情况

c - 将 float 类型转换为 int

arrays - 从Powershell中的对象中删除一个或多个成员

java - 如何随机选择多个对象之一添加到数组列表中?

c - 将 float 存储为 GashTable 中的键

c++ - 与顺序索引相比,随机索引数组是否会对性能产生影响?