1

根据这个https://stackoverflow.com/a/3912959/1814023我们可以声明一个接受二维数组的函数

void func(int array[ROWS][COLS]).

根据这个,http://c-faq.com/aryptr/pass2dary.html他们说“由于被调用的函数没有为数组分配空间,它不需要知道整体大小,所以行数" _

我试过这个并且它有效......请注意,我已经更改了列的大小。

#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”?即使我提供了错误的列大小。有人可以解释一下吗?

4

2 回答 2

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). 数组表示法只是为您完成所有这些复杂的数学运算,但您仍然必须向编译器提供所需的数据。确保数据完整性由您决定:)

于 2013-10-28T07:49:45.847 回答
0

当我编译并运行您的程序时(在 Ubuntu 12.04 上修复 func/func1 混淆并更改 getch 之后)会发生这种情况

$ 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 调用等非常有用。

于 2013-10-25T13:49:53.947 回答