根据条件动态分配内存或在堆栈上分配内存(if语句)

时间:2015-06-18 18:28:27

标签: c memory

我有一个C程序,其中一个浮点数组的元素在程序的持续时间内经常被访问。数组的大小取决于用户将输入的参数,因此会有所不同。通常,大小足够小(~125个元素),这样阵列的内存可以放在堆栈上,因此分配和访问它会更快。但在极少数情况下,阵列可能足够大,因此需要动态分配。我最初的解决方案如下:

if(size < threshold){

    float average[size];
}
else{
    float *average;
    average = (float*)malloc(sizeof(float) * size ); 
}

// Do some stuff with average

这在编译时出错。如何解决这样的问题?

1 个答案:

答案 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参数声明的好机会。