编译器不将C中的自动存储类数组放入堆栈中

bfhwhh0e  于 2023-01-16  发布在  其他
关注(0)|答案(1)|浏览(102)

TASKING编译器显示与嵌入式项目函数内自动数组初始化相关的不同输出:
代码变体1:

#define ARRAY_LENGTH (3u)

void my_func(void)
{
    /* VARIANT 1: Initialisation of array */
    float my_array[ARRAY_LENGTH] = {1.f,2.f,3.f};

    ...

    return;
}

代码变体2:

#define ARRAY_LENGTH (3u)

void my_func(void)
{
    /* VARIANT 2: array is not initialized */
    float my_array[ARRAY_LENGTH];

    /* VARIANT 2: values are assigned later in the code */
    my_array[0] = 1.f;
    my_array[1] = 2.f;
    my_array[2] = 3.f;

    ...

    return;
}

通过使用代码变体1生成一个.map文件,我可以观察到编译器在数据内存中为这个局部数组分配了一些位置。
相比之下,我在代码变体2中没有观察到它,假设编译器将局部数组放在堆栈中。
目前,我无法在TASKING用户手册中找到解释

2w2cym1i

2w2cym1i1#

基本上:

  • 局部作用域的数组具有自动存储持续时间,编译器可以随意将其分配到任何位置。
  • 文件范围内的数组具有静态存储持续时间,在这种情况下,它几乎肯定会以.data结束。

因此,如果您 * 希望 * 数组以.data结束,则将其声明为static和/或将其放在文件范围内。
与您的问题无关,在返回void的函数末尾添加return ;是非常可疑的,不会通过任何像样的安全相关代码审查,因为在安全相关应用程序中,心血来潮添加的没有任何理由的奇怪代码是不可接受的(而且很可能也违反了MISRA,我的头掉了下来)。

相关问题