我有一个C程序,其中一个浮点数组的元素在程序的持续时间内经常被访问。数组的大小取决于用户将输入的参数,因此会有所不同。通常,大小足够小(~125个元素),这样阵列的内存可以放在堆栈上,因此分配和访问它会更快。但在极少数情况下,阵列可能足够大,因此需要动态分配。我最初的解决方案如下:
if(size < threshold){
float average[size];
}
else{
float *average;
average = (float*)malloc(sizeof(float) * size );
}
// Do some stuff with average
这在编译时出错。如何解决这样的问题?
答案 0 :(得分:2)
average
的声明在您的代码中的生命周期有限;它一直持续到街区的尽头。换句话说,您声明average
的方式使其仅在if/else
块内可用。
我建议将其拆分为两个函数:一个处理分配;另一个做的工作。像这样:
void do_average(int size, int threshold) {
if (size < threshold) {
float avg[size];
average(size, avg);
} else {
float *avg = malloc(sizeof(*avg)*size);
assert(avg != NULL);
average(size, avg);
free(avg);
}
}
void average(int avg_size, float avg[static avg_size]) {
/* Do some stuff with avg */
}
您可能想要考虑如何处理malloc()
返回NULL
的{不太可能的)事件。 assert()
可能不是更好的选择。我只是把它放在那里,以确保你不要忘记检查错误。
注意:如评论中所述,这是使用VLA参数声明的好机会。