我如何声明一个带有变量的数组,但不使用C中的malloc() ?



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

char histPlot[max+1][52] = "";
然而,当我编写代码时,我了解到C,或者至少是我的编译器,不允许在没有常量值的情况下声明数组。我为这门课写代码的教授不清楚我们是否可以在这个作业中使用malloc()。假设我不能使用malloc(),是否有任何方法可以创建数组histPlot[][]的高度恰好为max + 1 ?

编辑:所以我已经接受了,没有真正的方法来完成我想做的事情,而不使用malloc()或一些类似的功能。我确实设法找到了一个解决方案,不涉及这些功能或二维数组,但感谢那些谁回答!

有些系统提供alloca功能。(然而,这不是标准的c)

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

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

  • 使用callocrealloc来分配内存(遵循规则的字母,你不能使用malloc,但不能使用spirit)
  • …或mmap(如果你的平台有)
  • 如果它不是一个真正的数组,使用一个临时文件来存储你的数据(通过fseek, fread, fwrite访问)
  • 如果可以使用链表,则可以通过递归函数调用在堆栈上构建其中的一个

在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()在堆上创建一个数组是有意义的。

在C99之前,基本上,如果它是可变长度数组,则需要动态分配。这意味着malloc或类似的函数之一。

如果你使用C99,你可以直接声明它

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

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

相关内容

  • 没有找到相关文章

最新更新