我正在尝试将数组传递给函数,但是输出中没有任何显示,为什么?

时间:2018-09-20 02:00:57

标签: c arrays

我有:

void displayMatrix(int a[][]){

    int howManyRows = sizeof(a)/sizeof(a[0]);
    int howManyColumns = sizeof(a)/sizeof(int);

    int r, c;

    for (r = 0; r < howManyRows; r++){
            if (r >= 1){
                printf("\n");
            }
        for (c = 0; c < howManyColumns; c++){
            printf("%d ",a[r][c]);
        }
    }


}

但是当我创建一个数组时

int samp[4][5] = {
    {1,2,3,4,5},
    {6,7,8,9,10},
    {11,12,13,14,15},
    {16,17,18,19,20}
    };

并将其传递给main函数,屏幕上没有任何显示。发生了什么事?

2 个答案:

答案 0 :(得分:2)

之所以会这样,是因为在函数参数中,数组会衰减到顶层的指针。所以你的功能

void displayMatrix(int a[4][5])

没有什么不同
void displayMatrix(int (*a)[5])

关于N1570,第6.7.6.3节,第7段:

  

将参数声明为“类型数组”应调整为“类型的合格指针”,...

这会导致意外的行为:

int howManyRows = sizeof(a)/sizeof(a[0]);

sizeof(a) == sizeof(void*)sizeof(a[0]) == 5*sizeof(int)

通常5个整数的长度比指针长,因此您毕竟会得到howManyRows = 0

尝试对#行进行硬编码或通过额外的参数将其传递:

void displayMatrix(int a[][5], int rows)

答案 1 :(得分:1)

这是C编程的经典陷阱。您必须了解C中的数组实际上是什么,以及如何理解该代码为何不起作用。

当您创建大小为x的“数组”时,编译器会预留足够的内存来容纳某些对象的x元素。这实际上只是一块内存,没有其他特殊之处。如果数组是4个整数之一,每个整数4个字节,则编译器会预留4 * 4个字节(16)。实际上,包含数组的变量不过是指向数组开头的指针。从头开始访问数组很简单,然后向前移动所需的字节数以找到指定的对象。

也就是说,数组在声明的函数中确实具有特殊的属性。它们被称为数组,它们的总大小已存储,并且可以由sizeof运算符访问。此属性在该函数以外的任何地方无效。如果将数组作为参数传递,则传递的只是指针,而不是有关数组的任何信息。无法获得其大小。您的代码将永远无法使用,也将无法使用。