所以我必须创建一个2D数组,它将用于打印直方图。我知道数组的宽度是52个元素,但是数组的高度等于max + 1
,每次调用它所在的函数时,它的高度都会有所不同。理想情况下,该行将完成以下功能:
char histPlot[max+1][52] = "";
然而,当我编写代码时,我了解到C,或者至少是我的编译器,不允许在没有常量值的情况下声明数组。我为这门课写代码的教授不清楚我们是否可以在这个作业中使用malloc()。假设我不能使用malloc()
,是否有任何方法可以创建数组histPlot[][]
的高度恰好为max + 1
?
编辑:所以我已经接受了,没有真正的方法来完成我想做的事情,而不使用malloc()
或一些类似的功能。我确实设法找到了一个解决方案,不涉及这些功能或二维数组,但感谢那些谁回答!
有些系统提供alloca
功能。(然而,这不是标准的c)
除此之外,没有真正的方法可以获得动态大小的数组。
我可以提供以下或多或少愚蠢的解决方案:
- 使用
calloc
或realloc
来分配内存(遵循规则的字母,你不能使用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;
}
输出: