所以我必须创建一个2D数组,用于打印直方图。我知道数组将是52个元素宽,但数组的高度将等于max + 1
,每次调用它的函数时它都会不同。理想情况下,该行将完成以下功能:
char histPlot[max+1][52] = "";
然而,当我编写代码时,我了解到C或者至少是我的编译器,不允许在没有常量值的情况下声明数组。我写这段代码的I级教授不清楚我们是否可以使用malloc()进行这项任务。假设我无法使用malloc()
,是否有任何方法可以创建数组histPlot[][]
以使其高度为max + 1
?
编辑:所以我已经接受了没有真正的方法可以完成我在没有使用malloc()
或类似功能的情况下尝试做的事情。我确实找到了一个根本不涉及这些功能或2D阵列的解决方案,但是感谢那些回复的人!
答案 0 :(得分:0)
在C99之前,从根本上说,如果它是一个可变长度数组,则需要动态分配。这意味着malloc
或其中一个类似的功能。
如果你使用C99,你可以直接申报。
答案 1 :(得分:0)
某些系统提供alloca
功能。 (但是,这不是标准C。)
除此之外,还没有真正的方法来获得动态大小的数组。
我可以提供以下或多或少愚蠢的解决方法:
calloc
或realloc
分配内存(遵循您不能使用malloc
而不是精神的规则的字母)mmap
(如果您的平台有此功能)fseek
,fread
,fwrite
进行访问)< / 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