C语言 求二维无大小数组的大小并打印其所有元素

eqoofvh9  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(120)

我一直在学习C语言,偶然发现了这个练习:
给定这个二维无大小数组:

char list_ch[][2] = {
    '1', 'a',
    '2', 'b',
    '3', 'c',
    '4', 'd',
    '5', 'e',
    '6', 'f',
};

编写一个程序来计算数组所占用的总字节数,然后打印出数组的所有元素。
我尝试使用两个for循环来完成它:

int main() {
    char list_ch[][2] = {
        '1', 'a',
        '2', 'b',
        '3', 'c',
        '4', 'd',
        '5', 'e',
        '6', 'f'
    };
    int i;
    int k;
    int size = 0;
    for (i = 0; list_ch[i] != '\0'; i++) {
        for (k = 0; k < 2; k++) {
            size++;
            printf("%c ", list_ch[i][k]);
        };
    };
    printf("%d", size);
    return 0;
}

然而,程序打印了一长串不同的字符,并且没有打印大小。我做错了什么?

holgip5t

holgip5t1#

list_ch[i] != '\0'总是失败。这也是一个奇怪的错误编码,因为list_ch[i]是一个1D数组,将一个数组与一个 null字符 * 进行比较意味着误解。
list_ch[i]作为一个 array,永远不会为0。
array * 的所有地址永远不会为0。(指针可以为0 -但这是另一回事)。
最后,代码尝试访问超出数组边界的内容,导致 * 未定义行为 * UB。
使用sizeof来辨别2D数组属性。@William Pursell

总字节数

printf("%zu\n", sizeof list_ch);

尺寸

size_t rows = sizeof list_ch / sizeof list_ch[0];
size_t cols = sizeof list_ch[0] / sizeof list_ch[0][0];

打印其所有元素

for (size_t r = 0; r < rows; r++) {
  const char *sep = "";
  for (size_t c = 0; c < cols; c++) {
    printf("%s%c ", sep, list_ch[r][c]);
    sep = " "; 
  }
  printf("\n");
}

相关问题