C语言中的用户定义数组大小

4

我正在阅读《Illustrated C》这本书,第一个练习题是:

编写一个名为MATMUL的程序,可以计算任意指定大小的矩阵相乘。

下面是我迄今为止想出来的代码。但是我读到说所有属性都需要在主函数之前声明。那么我如何在不在主函数中声明它们的情况下获得自定义大小的数组呢?

#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;
}

1
在发布问题前,你至少应该编译一下代码看看会发生什么。这样你就会发现自己做对了。 (你的代码中还有其他错误,这是我知道你没有编译它的原因。) - cape1232
@cape1232:我已经编译了代码,但由于大多数错误都与“'A':未声明的标识符”有关,所以我想我会解决数组问题。循环和分号我可以处理。 - Ashley
2个回答

6

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

您的问题已被标记为C,而可变长度数组是C99的一部分,因此float A[i][j],B[j][k],C[i][k];是合法的。

编辑

如果您的编译器不支持C99,则除了使用动态内存分配之外别无选择。

示例:

  float **A;
  int l;
  A= (float**)malloc(i*sizeof(float*));
  for(l=0;l<i;++l)
     A[l]= (float*)malloc(j*sizeof(float));

注意: 使用完后不要忘记释放内存,调用free.


他的问题可能是,此处不允许变量声明。添加一些 {} 或使用第二种方法... - tanascius
1
如果您需要支持某个编译器(它们仍然存在),那么我会建议您升级编译器。 - Prasoon Saurav
4
抱歉,MSVC不支持C99。 - Ivo Wetzel
1
如果你采纳Prasoon的建议并升级编译器,然后使用可变长度数组(VLAs),请确保不允许超大的维度。GCC将VLAs放在堆栈上。 - nmichaels
我安装了CodeBlocks,这样我就可以使用GNU GCC进行编译。 - Ashley
显示剩余2条评论

3

您可能希望动态分配内存来存储数组。大致的代码如下:

float *a;
int siz;    /* store user input here */

/* <snip> */

/* allocate a float array with `siz` elements */
a = (float *) malloc(sizeof(float) * siz);

注意:针对二维数组请相应地进行调整。


2
我不会说他需要这样做,更像是“他也可以”。 - Michael Foukarakis
为什么这个答案被踩了?也许他应该对malloc分配的内存进行显式转换为(float *),但这个答案是正确的。 - A. Levy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接