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

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

问题描述:

我有一个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 ] 

地址:

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]相似的东西。

那是因为你的函数是有效的:

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

但这是真的:

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

所以宏产生使用sizeof错误的结果(你计算指针的大小,和两个元素的char数组的大小)。如果您将这两个值作为参数传递给函数并将其用于循环中,则应该起作用。

+0

感谢您的快速回复。你和rra的回答基本上是一样的,但我已经接受了他的回答,因为没有其他原因,我只是先读它:/ – hakoja 2013-03-18 00:03:29

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