user-0 提问: 变长数组函数问题（C primer plus中例题）？

回复:
user: user-1
content: 用指针来替换

user: user-2
content: 引用 6 楼 qq_21869373 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 因为传递二维数组的形参必须列数确定才可以，而ar[rows][cols]，rows和cols也是形参，cols不能确定大小。因此会提示错误。如果要传二维数组，但是二维数组的列数不能确定，建议传一维指针。如下：   #include <stdio.h>  #define ROWS 3 #define COLS 4  int sum2d(int rows, int cols, int *ar);  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[0][0]));     printf("2x6　array\n");     printf("Sum　of　all　elements　=　%d\n", sum2d(ROWS  - 1,                 COLS + 2, &morejunk[0][0]));     printf("3x10　VLA\n");     printf("Sum　of　all　elements　=　%d\n", sum2d(rs, cs, &varr[0][0]));     return 0; }  // 带变长数组形参的函数 int sum2d(int rows, int cols, int *ar) {     int r;     int c;     int tot = 0; #if 0     for (r = 0; r < rows; r++)         for (c = 0; c < cols; c++)             tot += ar[r][c]; #else     for (r = 0; r < rows * cols; r++)         tot += ar[r]; #endif     return tot; } 不考虑更改，书上例子说有运行结果，我完全按书上来，怎么报错了？[/quote]  不很清楚，在我的编译器里是编译不过的，但从传二维数组到函数，形参就需要指定/确定列数。

user: user-3
content: 可能VC不支持VLA，换C++Builder、GCC、intel C++就好了

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:因为传递二维数组的形参必须列数确定才可以，而ar[rows][cols]，rows和cols也是形参，cols不能确定大小。因此会提示错误。如果要传二维数组，但是二维数组的列数不能确定，建议传一维指针。如下：   #include <stdio.h>  #define ROWS 3 #define COLS 4  int sum2d(int rows, int cols, int *ar);  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[0][0]));     printf("2x6　array\n");     printf("Sum　of　all　elements　=　%d\n", sum2d(ROWS  - 1,                 COLS + 2, &morejunk[0][0]));     printf("3x10　VLA\n");     printf("Sum　of　all　elements　=　%d\n", sum2d(rs, cs, &varr[0][0]));     return 0; }  // 带变长数组形参的函数 int sum2d(int rows, int cols, int *ar) {     int r;     int c;     int tot = 0; #if 0     for (r = 0; r < rows; r++)         for (c = 0; c < cols; c++)             tot += ar[r][c]; #else     for (r = 0; r < rows * cols; r++)         tot += ar[r]; #endif     return tot; } 不考虑更改，书上例子说有运行结果，我完全按书上来，怎么报错了？

user: user-0
content: 引用 3 楼 colinfang2006 的回复:用指针来替换这个是书上例子，书上说可以运行结果，我咋运行不出来？ 下面是该程序的输出： 3x5　array Sum　of　all　elements　=　80 2x6　array 718 Sum　of　all　elements　=　315 3x10　VLA Sum　of　all　elements　=　270

user: user-0
content: 书上例题程序错了吗？

user: user-2
content: 因为传递二维数组的形参必须列数确定才可以，而ar[rows][cols]，rows和cols也是形参，cols不能确定大小。因此会提示错误。如果要传二维数组，但是二维数组的列数不能确定，建议传一维指针。如下：   #include <stdio.h>  #define ROWS 3 #define COLS 4  int sum2d(int rows, int cols, int *ar);  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[0][0]));     printf("2x6　array\n");     printf("Sum　of　all　elements　=　%d\n", sum2d(ROWS  - 1,                 COLS + 2, &morejunk[0][0]));     printf("3x10　VLA\n");     printf("Sum　of　all　elements　=　%d\n", sum2d(rs, cs, &varr[0][0]));     return 0; }  // 带变长数组形参的函数 int sum2d(int rows, int cols, int *ar) {     int r;     int c;     int tot = 0; #if 0     for (r = 0; r < rows; r++)         for (c = 0; c < cols; c++)             tot += ar[r][c]; #else     for (r = 0; r < rows * cols; r++)         tot += ar[r]; #endif     return tot; }

user: user-4
content: const int rs = 3; const int cs = 10;