我有一个2x3 char
矩阵存储在列主顺序(是的,我知道这有点令人困惑,但请忍受我),作为一个多维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) = %zun", ARRAY_SIZE(a));
printf("sizeof(a[0]) = %zun", 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 ]
这是因为你的函数是有效的:
void print_matrix(char a[3][2])
但这实际上是:
void print_matrix(char (*a)[2])
因此,您的宏使用sizeof
产生错误的结果(您正在计算指针的大小,以及两个元素char
数组的大小)。如果将这两个值作为参数传递给函数,并在循环中使用它们,它应该可以工作。
添加:
printf("ARRAY_SIZE(a) = %zun", ARRAY_SIZE(a));
printf("ARRAY_SIZE(a[0]) = %zun", 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]模糊等价的东西。
sizeof操作符不起作用,因为作为参数发送的数组被转换为指针,指针发生衰变!所以在函数内部你无法知道矩阵的大小