我有:
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函数,屏幕上没有任何显示。发生了什么事?
答案 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运算符访问。此属性在该函数以外的任何地方无效。如果将数组作为参数传递,则传递的只是指针,而不是有关数组的任何信息。无法获得其大小。您的代码将永远无法使用,也将无法使用。