将多维数组作为C中函数的参数传递

时间:2016-01-13 11:28:28

标签: c multidimensional-array cs50

我目前正在CS50的问题集3中进行十五次练习。但是,我一直在搞清楚将多维数组作为参数传递给函数的语法。例如,以下代码(在数组中打印出一些数字)编译并运行:

#include <stdio.h>

void func(int array[], int size);

int main()
{
    int size = 3;
    int array[3] = {1,2,3};
    func(array,size);
    printf("Done\n");
}

void func(int array[], int size)
{
    printf("%i %i %i\n", array[0],array[1], array[2]);
}

但这并不是:

#include <stdio.h>

void func(int array[], int size);

int main()
{
    int size = 3;
    int array[2][2] = {{1,2,3},{4,5,6},{7,8,9}};
    func(array,size);
    printf("Done");
}

void func(int array[], int size)
{
    printf("%i %i %i\n", array[0][0],array[1][1], array[2][2]);
}

这是clang提供的错误:

test.c:3:20: error: array has incomplete element type 'int []'
void func(int array[][], int size);
                   ^
test.c:13:20: error: array has incomplete element type 'int []'
void func(int array[][], int size)

任何人都可以向我解释我的语法有什么问题吗?我不太了解clang给我的错误信息。

5 个答案:

答案 0 :(得分:2)

函数func()需要一个指向int 的指针,但是你将一个指针传递给一个数组。因此,错误。 这是因为当您将数组传递给函数时,数组会转换为指向其第一个元素的指针。

您可以更改函数原型和定义以接收指向数组的指针:

void func(int (*array)[3], int size);

int main()
{
    int size = 3;
    int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    func(array,size);
    printf("Done");
}

void func(int (*array)[3], int size) {
  ...
}

请注意,您的数组初始化为3x3。所以阵列大小至少要达到3x3。

C99允许您传递尺寸。所以你也可以这样写:

void func(int x, int y, int a[x][y]);

int main()
{
    int size = 3;
    int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    func(3, 3, array);
    printf("Done");
}

void func(int x, int y, int array[x][y])
{
    printf("%i %i %i\n", array[0][0],array[1][1], array[2][2]);
}

答案 1 :(得分:1)

数组不是C中的类型!在内部,它总是作为指针处理,因此,指向数组的指针作为参数而不是数组本身传递。

如果您打算将数组作为参数传递(而不仅仅是指针),您应该重新考虑您的设计!

如果你仍然需要这样做,将数组包装成一个结构并传递结构。

struct astruct
{
   int size;
   int array[3];
};

答案 2 :(得分:0)

在声明原型时以及在定义函数时需要指定数组的大小。现在它的类型不完整。

试试这个 -

void func(int array[][3], int size)

同样在数组的函数大小应该增加 -

 int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};    //Note - size of array is changed

答案 3 :(得分:0)

int a[][]之类的声明并不合理,因为编译器必须知道所有维度的大小(最外层的除外)以计算访问时的内存地址。

即。如果数组声明为

int array[][a][b];

访问

的内存地址
array[2][1][3];

计算
base_address + (2*a*b + 1*b + 3) * sizeof int

在不知道a和/或b的情况下,这种计算是不可能的。

答案 4 :(得分:0)

简单地告诉函数期望一个多维数组:

void func (int array[3][3], int size);

或者如果您希望功能完全灵活:

void func (int x, int y, int array[x][y]);