使用变量声明数组的大小

时间:2017-08-19 02:23:37

标签: c arrays

#include <stdio.h>
#include <stdlib.h>

#pragma warning (disable : 4996)

void main() {

    int matrix[30][50];

    int sizeRow, sizeCol;

    printf("Number of Rows in your table    : ");
    scanf("%d", &sizeRow);

    printf("Number of Columns in your table : ");
    scanf("%d", &sizeCol);

    int sum[sizeRow] = { 0 };

    for (int row = 0; row < sizeRow; row++){
        for (int col = 0; col < sizeCol; col++){
            printf("Input element [%d][%d] : ", row, col);
            scanf("%d", &matrix[row][col]);
            sum[row] += matrix[row][col];
        }
    }

    printf("Total of each row:\n");
    for (int row = 0; row < sizeRow; row++){
        printf("ROW[%d] SUM :\t%d\n", row, sum[row]);
    }

    system("pause");
}

我在int sum[sizeRow] = { 0 };中遇到错误,它说我的数组应该是一个常量,但在我的情况下,用户应该确定数组大小。我能解决这个问题吗?

4 个答案:

答案 0 :(得分:6)

MSVC不支持可变长度数组。您需要使用calloc分配内存。与malloc不同,calloc将所有字​​节初始化为0:

int *sum = calloc(sizeRow, sizeof(int));

之后不要忘记free记忆。

答案 1 :(得分:4)

我刚刚注意到您正在使用MSVC。如今,可以使用VLA。从Visual Studio 2015开始,它[几乎]完全实现了C99,但仍然将所有C99功能视为语言扩展(例如,禁用语言扩展也禁用C99支持)。 因此,您要么使用先前版本,要么禁用某些扩展。此外,在下一步中,您很可能会遇到可变大小对象可能未初始化的消息。

  

以下示例   演示了如何在a中使用C99可变长度数组(VLA)   firstprivate指令(第26页的Section 2.7.2.2)。资料来源:MS Developer Network

void f(int m, int C[m][m])  
{  
    double v1[m];  
    ...  
    #pragma omp parallel firstprivate(C, v1)  
    ...  
}  
  

假设您的“问题”是编译器对象,如果您正在使用   GCC或Clang,请尝试将标记-std=c99-std=c11添加到您的   命令行。 GCC默认使用旧版本的C语言   没有此功能。

     

除非您打算返回数组,否则不需要malloc。总是   使用最简单的方法。

答案 2 :(得分:2)

int sum[sizeRow]声明了一个在C99中引入的可变长度数组,旧版本的MSVC不支持VLA。
另请注意,对VLA的限制之一是它无法使用初始化列表初始化,因此无法使用行

进行初始化
int sum[sizeRow] = { 0 };
即使您使用支持VLA的编译器进行编译,

也会引发错误消息。

§6.7.9-P(3):

  

要初始化的实体的类型应为未知大小的数组或不是可变长度数组类型的完整对象类型。

使用memset

int sum[sizeRow];  
memset(sum, 0, sizeof(sum));  

for循环初始化

for(int i = 0; i < sizeRow; i++)
    sum[i] = 0;

答案 3 :(得分:0)

你应该包含一个#define指令来设置数组行和列,然后让用户输入它们,如下所示:

#define ROWCOL
#define COLUMNCOL