为什么不打印矩阵的最后一列?

时间:2013-03-17 23:30:53

标签: c multidimensional-array

我有一个以列主要顺序存储的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) = %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 ]

3 个答案:

答案 0 :(得分:3)

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

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

但这确实是:

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

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

答案 1 :(得分: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]。

答案 2 :(得分:0)

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