为什么我不能将可变长度数组传递给C中的函数?

时间:2017-01-24 21:10:09

标签: c arrays

我目前正在使用MinGW编译器在Windows环境中学习C.

我似乎无法将可变长度数组传递给函数。我怀疑它是我正在使用的编译器,但不确定并且想知道是否有人对问题可能是什么有任何想法。我不认为这是一个语法问题,因为我在研究这个问题时已经看到了相同的语法。

在这篇文章的最后是我读过的一本书(Stephen Prita的C Primer Plus)的示例代码,它不会为我编译。我也试过编写自己的代码并得到类似的结果。问题似乎出现在这个函数声明行中:

int sum2d(int rows, int cols, int ar[rows][cols]);

我得到的错误是:" 在功能体之外使用参数']' token int sum2d(int rows,int cols,int ar [rows] [cols]); "

问题似乎是我不能使用int rows和int cols参数,这些参数也会传递给函数,因为数组中的索引也会被传递。我现在的工作是将变量长度数组保留在main函数中,但这限制了我模块化代码的能力。

我发现一些帖子,比如这些,似乎在C ++中讨论相同的问题:int[n][m], where n and m are known at runtimePassing 2D array with variable Size。但是我在这个主题上发现的每篇文章都是关于C ++而不是C,他们都说与C一起工作但不能用C ++工作。但我发现它对C也不起作用。其中许多链接讨论了使用vector。在我的C学习中,我已经知道vector是否在C中可用了还不够。现在,我只是想知道是否有人知道为什么将可变长度数组传递给函数不起作用对我来说。

书中的例子:

//vararr2d.c -- functions using VLAs
#include <stdio.h>
#define ROWS 3
#define COLS 4
int sum2d(int rows, int cols, int ar[rows][cols]);
int main(void)
{
     int i, j;
     int rs = 3;
     int cs = 10;
     int junk[ROWS][COLS] = {
            {2,4,6,8},
            {3,5,7,9},
            {12,10,8,6}
     };

     int morejunk[ROWS-1][COLS+2] = {
            {20,30,40,50,60,70},
            {5,6,7,8,9,10}
     };

     int varr[rs][cs];  // VLA

     for (i = 0; i < rs; i++)
         for (j = 0; j < cs; j++)
             varr[i][j] = i * j + j;

     printf("3x5 array\n");
     printf("Sum of all elements = %d\n",
             sum2d(ROWS, COLS, junk));

     printf("2x6 array\n");
     printf("Sum of all elements = %d\n",
             sum2d(ROWS-1, COLS+2, morejunk));

     printf("3x10 VLA\n");
     printf("Sum of all elements = %d\n",
             sum2d(rs, cs, varr));

     return 0;
}

// function with a VLA parameter
int sum2d(int rows, int cols, int ar[rows][cols])
{
    int r;
    int c;
    int tot = 0;

    for (r = 0; r < rows; r++)
        for (c = 0; c < cols; c++)
            tot += ar[r][c];

    return tot;
}

0 个答案:

没有答案