【问题标题】:How can I declare an array with a variable, but without using malloc() in C?如何声明一个带有变量的数组,但在 C 中不使用 malloc()?
【发布时间】:2017-03-19 13:58:34
【问题描述】:

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

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

然而,在我编写代码时,我了解到 C 或至少我的编译器不允许在没有常量值的情况下声明数组。我正在为其编写此代码的班级的教授不清楚我们是否可以将 malloc() 用于此作业。假设我不能使用malloc(),有什么方法可以创建数组histPlot[][] 使其高度正好为max + 1

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

【问题讨论】:

    标签: c arrays malloc


    【解决方案1】:

    某些系统提供alloca 函数。 (不过,这不是标准的 C。)

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

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

    • 使用callocrealloc分配内存(遵循不能使用malloc但不能使用精神的规则)
    • ...或mmap(如果您的平台有)
    • 如果它不必是一个真正的数组,请使用temporary file 来存储您的数据(通过fseekfreadfwrite 访问)
    • 如果您可以改用链表,则可以通过递归函数调用在堆栈上构建其中一个

    【讨论】:

    • 哈哈,我确实被你的第一个解决方案逗乐了。我应该更清楚,我们可以使用的唯一库是 stdio.h math.h 和 ctype.h。幸运的是,我设法提出了一个完全不同的解决方案,它可以工作并且完全绕过了对 2D 阵列的需求。非常感谢您的帮助!
    【解决方案2】:

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

    【讨论】:

    • 我的问题是我什至不能在不使用常量值的情况下声明数组。幸运的是,我找到了一个不同的解决方案来解决我的问题,它完全绕过了对 2D 数组的需求。我对堆和堆栈一无所知,所以感谢你教我 C 的一些新知识!
    【解决方案3】:

    在C99之前,基本上,如果是变长数组,就需要动态分配。这意味着malloc 或类似功能之一。

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

    【讨论】:

    • 我很确定这是 C99,但它仍然不允许我直接声明它。但是,我确实找到了一个不同的解决方案来解决我的问题,它根本不需要 malloc() 或 2D 数组。谢谢!
    【解决方案4】:

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

    #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

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多