用户在C中定义的数组大小

Ash*_*Ash 4 c arrays pointers

我正在阅读"插图C",第一个练习题是:

程序MATMUL将固定大小的矩阵相乘.使程序处理任何指定的大小.

所以下面是我到目前为止提出的代码.但是我读到所有属性都需要在main函数之前声明.那么如何获得自定义大小的数组而不在主函数中声明它们?

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

int n, m, i, j, k;

int main(void)
{
    printf("\nEnter:rows for A, columns for A and rows for B, columns for B\n");
    scanf("%i %i %i", &i, &j, &k);
    float A[i][j], B[j][k], C[i][k];    //Not legal, right?

    /*Read in A array*/
    for(n=0; n<i; ++n)
        for(m=0; m<j; ++m)
            scanf("%f", &A[n][m]);

    /*Read in B array*/
    for(n=0; n<j; ++n)
        for(m=0; m<k; ++m)
            scanf("%f", &B[n][m]);

    /*Calculate C array*/
    for(j=0; j<i; ++j)
        for(i=0; i<k; ++i)
        {
            C[i][j] = 0;
            for (k=0; k<j; ++k)
                C[i][j] += A[i][k] * B[k][j];
        }
    for(n=0; n<i; ++n)
         for(m=0; m<k; ++m)
        printf("\n%.2f\t", C[n][m]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*rav 6

float A [i] [j],B [j] [k],C [i] [k]; //不合法,对吗?

您的问题已被标记,C并且VLA是C99的一部分,因此float A[i][j], B[j][k], C[i][k];是合法的.

编辑

如果您的编译器不支持C99,那么除了以外没有其他选项dynamic memory allocation.

例:

  float **A;
  int l;
  A= (float**)malloc(i*sizeof(float*));
  for(l=0;l<i;++l)
     A[l]= (float*)malloc(j*sizeof(float));
Run Code Online (Sandbox Code Playgroud)

注意:完成后不要忘记free记忆.

  • 不,MSVC不支持C99. (4认同)