1

我有一个char以列主顺序存储的 2x3 矩阵(是的,我知道这有点令人困惑,但请耐心等待),作为多维char[3][2]数组(注意索引的切换)。现在,我想打印这个矩阵。但是,由于某种原因,最后一列没有打印出来。这是为什么?

这是我的代码:

#include <stdio.h>

#define ARRAY_SIZE(x) ((sizeof (x)) / (sizeof((x)[0])))

typedef char matrix[3][2];

void print_matrix(matrix a)
{
    for (size_t i = 0; i < ARRAY_SIZE(a[0]); i++) {
        printf("[");
        for (size_t j = 0; j < ARRAY_SIZE(a); j++) {
            printf(" %c", a[j][i]);
        }   
        printf(" ]\n");
    }
}

int main(int argc, char *argv[])
{
    matrix a = {{'a','b'},{'c','d'},{'e','f'}};
    printf("sizeof(a) = %zu\n", ARRAY_SIZE(a));
    printf("sizeof(a[0]) = %zu\n", ARRAY_SIZE(a[0]));
    print_matrix(a);
    return 0;
}

编译和运行给了我这个:

$ gcc -Wall -std=c99 foo.c; ./a.out
sizeof(a) = 3
sizeof(a[0]) = 2
[ a c ]
[ b d ]

预期输出:

[ a c e ]
[ b d f ]
4

3 回答 3

3

这是因为你的功能是有效的:

void print_matrix(char a[3][2])

但这真的是:

void print_matrix(char (*a)[2])

因此,您的宏使用sizeof(您正在计算指针的大小和两个元素char数组的大小)产生错误的结果。如果将这两个值作为参数传递给函数并在循环中使用它们,它应该可以工作。

于 2013-03-17T23:53:27.303 回答
2

添加:

printf("ARRAY_SIZE(a) = %zu\n", ARRAY_SIZE(a));
printf("ARRAY_SIZE(a[0]) = %zu\n", ARRAY_SIZE(a[0]));

print_matrix,你会看到问题:

ARRAY_SIZE(a) = 2
ARRAY_SIZE(a[0]) = 2

您已经被 C 的一个奇怪的极端案例所困扰。多维数组并没有像它们看起来那样得到完全支持。特别是,将它们作为参数传递给函数并不会完全创建您期望的数据类型,因此 ARRAY_SIZE 宏不能在函数参数上正常工作。

幕后实际发生的事情很奇怪,我不确定我是否理解得足够好来真正解释它,但简短的版本是作为函数参数的数组退化为指针。所以函数参数 char a[3][2] 实际上变成了一个隐约相当于 char *a[2] 的东西。

于 2013-03-17T23:54:24.477 回答
0

sizeof 运算符不起作用,因为作为参数发送的数组被转换为指针并且发生了指针的衰减!所以在函数内部你不知道矩阵的大小。

于 2013-03-31T20:13:43.307 回答