如何使用变量声明数组,但不在C中使用malloc()?

时间:2016-11-06 00:02:20

标签: c arrays malloc

所以我必须创建一个2D数组,用于打印直方图。我知道数组将是52个元素宽,但数组的高度将等于max + 1,每次调用它的函数时它都会不同。理想情况下,该行将完成以下功能:

char histPlot[max+1][52] = "";

然而,当我编写代码时,我了解到C或者至少是我的编译器,不允许在没有常量值的情况下声明数组。我写这段代码的I级教授不清楚我们是否可以使用malloc()进行这项任务。假设我无法使用malloc(),是否有任何方法可以创建数组histPlot[][]以使其高度为max + 1

编辑:所以我已经接受了没有真正的方法可以完成我在没有使用malloc()或类似功能的情况下尝试做的事情。我确实找到了一个根本不涉及这些功能或2D阵列的解决方案,但是感谢那些回复的人!

4 个答案:

答案 0 :(得分:0)

在C99之前,从根本上说,如果它是一个可变长度数组,则需要动态分配。这意味着malloc或其中一个类似的功能。

如果你使用C99,你可以直接申报。

答案 1 :(得分:0)

某些系统提供alloca功能。 (但是,这不是标准C。)

除此之外,还没有真正的方法来获得动态大小的数组。

我可以提供以下或多或少愚蠢的解决方法:

  • 使用callocrealloc分配内存(遵循您不能使用malloc而不是精神的规则的字母)
  • ...或mmap(如果您的平台有此功能)
  • 如果它不是真正的数组,请使用temporary file来存储您的数据(通过fseekfreadfwrite进行访问)< / LI>
  • 如果您可以使用链接列表,则可以通过递归函数调用在堆栈中构建其中一个

答案 2 :(得分:0)

在C99中,允许使用在运行时之前不可用的值声明可变长度数组。但是,您无法使用固定的初始化程序。这意味着代替

char histPlot[max+1][52] = "";

你必须写这样的东西:

char histPlot[max+1][52];
for (int i=0; i<=max; i++) {
    strcpy(histPlot[i], "");
}

请注意,在for()语句中声明int的能力是另一个C99扩展。要成功编译此代码,您可能需要在命令行中添加-std=c99之类的内容。

我还应该指出,堆上的可用空间比堆栈上的空间多得多。如果你需要声明一个大数组(即,如果max的值超过几百),那么使用malloc()在堆上创建数组是有意义的。

答案 3 :(得分:0)

如果它不是太大,你可以在堆栈中的函数中声明它。

#include <stdio.h>
void a(int b,int c) {
    char d[b][c];
    d[0][1] = 'a';
    printf("%c\n",d[0][1]);
    return;
}
int main() {
    a(8,14);
    return 1;
}

输出:a