我可以在循环内定义一个数组,其大小在每次迭代时都会变化

时间:2017-08-28 01:49:56

标签: c arrays pointers

我需要为每次迭代定义数组长度,以对数组元素执行某些操作。 但是每次迭代的数组大小都不同。因此,我将数组大小定义为arr [totalLen]:但totalLen每次迭代都会变化。

  • 我不能使用malloc,因为我正在使用的实时系统不允许动态内存分配

1) 这是定义数组的正确方法吗?元素的范围是" arr" (内存分配和变量的生命周期)每次迭代都会改变吗?

2)在具有最大元素数量的for循环之前定义数组的首选方法是什么?

/* some code here - to get the task info */
while (task[i].info!= NULL) 
{
    printf("\n Task Name is %s", task[i].Name);        
    scenario1= scenario2= scenario3= scenario4= 0;
    nvStruct  = (int '*)(TablesPtr->NVData );

    /* do something when each of the following scenario occurs */
    if ((scenario1= (!strcmp(task[i].Name, "Scenario1"))) || 
        (scenario2= (!strcmp(task[i].Name, "Scenario2"))) ||
        (scenario3= (!strcmp(task[i].Name, "Scenario3"))) ||
        (scenario4= (!strcmp(task[i].Name, "Scenario4")))) 
    {
        totalLen = *(nvStruct+1); // size of the struct
        printf("\nLength of the struct is %d", totalLen);

        int32 arr[totalLen]; // is this proper usage?

        for (uint32 len = 0; len < (totalLen)/4; len++)
            arr[len] = *(nvStruct+len);

        /* do something else with the array here */
        ....
        i++;

3 个答案:

答案 0 :(得分:0)

这有点奇怪。 C99之前不支持可变长度数组,C99支持它,但随后在C11中降级为可选,这意味着C11编译器可能不支持它们并且仍然遵循标准。

我自己只使用malloc

答案 1 :(得分:0)

定义这样的数组长度并不是一种好习惯。因为每个系统都分配了有限的内存,如果在循环迭代之前没有定义数组的大小,程序可能会在某些时候崩溃。因此,在循环之前为数组分配内存总是很好的实践。或者你可能会使用malloc ...这可能是使用数组的坏方面,因为你可能会分配更多可能不需要的内存。如果你没有在迭代内存分配之前定义内存大小,那么每次迭代都会改变。我希望你明白这一点

答案 2 :(得分:0)

如果尺寸可能“太大”,使用VLA通常是一个坏主意。你可以溢出堆栈,或者即使你不这样做,你也可以杀死缓存效率(并且缓存为王)。

“太大”的一个可能值是4096字节,但是YMMV。

所以,如果你知道它不会总是获取完整的4096(或其他)字节,那么只使用VLA来保存堆栈空间(因此更加友好) 。否则,请使用malloc

如果这个答案看起来太复杂(通常超出你的需要),根本就不要使用VLA。