按照这个https://stackoverflow.com/a/3912959/1814023我们可以声明一个接受二维数组作为
的函数void func(int array[ROWS][COLS]).
正因为如此,http://c-faq.com/aryptr/pass2dary.html他们说“由于被调用的函数没有为数组分配空间,所以它不需要知道整体大小,所以行数NROWS可以数组的宽度仍然很重要,因此必须保留列尺寸NCOLUMNS(以及三维或更多维数组中的插值)。“
我试过这个并且它有效...请注意,我已经改变了列的大小。
#include <stdio.h>
#define ROWS 4
#define COLS 5
void func1(int myArray[][25])
{
int i, j;
for (i=0; i<ROWS; i++)
{
for (j=0; j<COLS; j++)
{
myArray[i][j] = i*j;
printf("%d\t",myArray[i][j]);
}
printf("\n");
}
}
int main(void)
{
int x[ROWS][COLS] = {0};
func1(x);
getch();
return 0;
}
我的问题是,为什么在CFAQ链接(http://c-faq.com/aryptr/pass2dary.html)中他们说“The width of the array is still important
”?即使我提供了错误的列大小。
有人可以解释一下吗?
答案 0 :(得分:1)
这是使用数组表示法来表示指针所得到的。举例:
#include <stdio.h>
void size(int myArray[][25], int rows, int cols)
{
printf("sizeof(int [%d][%d]) = %d\n", rows, cols, sizeof(myArray));
}
int main(void)
{
int arr1[4][4];
int arr2[4][5];
int arr3[5][5];
size(arr1, 4, 4);
size(arr2, 4, 5);
size(arr3, 5, 5);
printf("sizeof(int *) = %d\n", sizeof(int *));
return 0;
}
如果你尝试运行它,即使传递的数组大小不同,所有4种尺寸都是相同的
C中的数组类型只是语法糖 - 多维数组在线性内存模型中没有任何意义。使用线性内存模型访问简单数组的元素,您必须知道两件事:基址和索引偏移量,因此您可以编写*(base+indexOffset)
。要索引二维数组中的元素,您必须知道另外两件事:第一维的大小和偏移量,因此您可以编写*(base+dimensionSize*dimensionOffset+indexOffset)
。数组表示法只是为您完成所有这些复杂的数学运算,但您仍必须向编译器提供所需的数据。由您来确保数据完整性:)
答案 1 :(得分:0)
当我编译并运行你的程序时(在修复func / func1混淆并修改getch后,在Ubuntu 12.04上)这就是发生的事情
$ gcc crashme.c -o crashme
crashme.c: In function ‘main’:
crashme.c:23:13: warning: passing argument 1 of ‘func1’ from incompatible pointer type [enabled by default]
crashme.c:4:6: note: expected ‘int (*)[25]’ but argument is of type ‘int (*)[5]’
jamie@jamie-Ideapad-Z570:~/temp$ ./crashme
0 0 0 0 0
0 1 2 3 4
0 2 4 6 8
0 3 6 9 12
Segmentation fault (core dumped)
如果添加一行
printf("%ld", sizeof(x));
在int x [声明之后,您将看到大小是4 x 5 x sizeof int(我的系统上为80)的大小,因此声明大小可用于sizeof,因此对malloc调用等非常有用。