如何在C中声明可变大小的数组?

时间:2013-09-21 19:44:41

标签: c arrays

好吧,我正在做矩阵乘法,我需要制作一个m x n数组和一个p x q数组。
但是,我不知道该怎么做。

这是我的程序,当我手动输入值时打印正确的输出:

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    /*
        Rows and columns for matrices.
    */
    int m , n; // rows and columns of the first matrix
    int p , q; // rows and columns of the second matrix

    /*
        1st matrix is a 2x3 matrix
    */
    m = 2;
    n = 3;

    /*
        2nd matrix is a 3x2 matrix
    */
    p = 3;
    q = 2;


    /*
        Create the matrices.
        Give them values.
    */
    int matrix1[m][n] = {
                            {2,3,4},
                            {5,6,7}
                        };
    int matrix2[p][q] = {
                            {1,7},
                            {3,9},
                            {5,11}
                        };

    /*
        Check if we can multiple the matrices.
        For matrix multiplication,
        the number of COLUMNS of FIRST matrix must be equal to
        the number of ROWS of SECOND matrix
    */
    if(n==p){
        /*
            Create a new matrix.
            The resulting matrix will have M rows and Q columns.
            That is, the matrix is a MxQ matrix.
        */
        int matrix3[2][2]; 

        /*
            We need three loops so we have 3 variables.
        */
        int i = 0; // iterates over matrix1 rows
        int j = 0; // iterates over matrix1 columns
        int k = 0; // iterates over matrix2 rows
        int l = 0; // iterates over matrix2 columns


        while(i < m){
            l = 0;
            while(l < q){
                int element = 0;
                while(j < n && k < p){
                    element += matrix1[i][j] * matrix2[k][l];
                    matrix3[i][l] = element;
                    j++;
                    k++;
                }
                printf("\t%d",element);
                l++;
                j = 0;
                k = 0;
            }
            printf("\n");
            i++;
        }

    }else{
        printf("Matrices can not be multiplied");
    }
}  

矩阵声明被标记为错误。 如何解决?

3 个答案:

答案 0 :(得分:3)

  

我该如何解决?

首先,不使用VLA。对于此特定任务,您不需要VLA。

关于实际问题是什么:无法初始化可变长度数组。您必须逐个分配它们的元素或使用一些质量“分配”技术,例如{ {1}}。

答案 1 :(得分:1)

是否可以使用C99

Variable Length Arrays

这在C99中是100%有效:

  int m = 2;
  int n = 3;

  int matrix1[m][n];

答案 2 :(得分:1)

根据当前的c标准,“原生”可变长度数组是可选的语言构造。您必须检查编译器文档以确定您使用的编译器是否支持可变长度数组。

在C99之前,需要在堆上显式分配变量长度数组并通过指针访问。对于矩阵问题,您有两种选择。

第一种方法是分配一个具有足够存储空间的数组,并在需要读取或修改矩阵元素时计算正确的索引。例如:

int* matrix_storage = malloc( sizeof( int ) * matrix_width * matrix_height );
// set row 0, column 1 to 0
matrix_storage[ ( 0 * matrix_width ) + ( 1 % matrix_width ) ] = 0; 

或者,您可以为每个行或列分配一个指针数组:

int** rows = malloc( sizeof( (int*) ) * matrix_height );
for( int i = 0; i < matrix_height; ++i )
{
    rows[i] = malloc( sizeof(int) * matrix_width );
}
row[0][1] = 0; // set row 0, column 1 to 0

这个实现浪费了一些内存,无论你选择哪种实现考虑使用函数和struct关键字来隐藏驱动程序代码中的实现(实际上是变异或读取矩阵的代码)。

一些注意事项:我使用了c99 for循环语法,对于较旧的编译器,int i变量需要在for循环之外声明。另请注意,如果您的矩阵大小可以在编译时确定(IE不依赖于用户输入),您不需要malloc的开销,并且可以硬编码您的数组大小。您发布的示例代码不需要动态分配。