繁体   English   中英

局部变量和静态变量

[英]Local variable and static variables

我只想了解RAM分配的区别。

为什么在函数之前定义变量会导致RAM溢出,而在函数内部定义它却可以吗?

例如:

/*RAM OK*/
void Record(int16_t* current, int i,int n)
{
  float Arr[NLOG2] = {0};
  for(i=0;i<n;i++)
      Arr[i]=current[i*5];
}

/*RAM OVERFLOW*/
static float Arr[NLOG2] = {0};

void Record(int16_t* current, int i,int n)
{
   for(i=0;i<n;i++)
       Arr[i]=current[i*5];
}

这是消息:

无法为<[0x200000c8-0x200031ff]>中的总估计最小大小为0x330b字节(最大对齐0x8)的段/块分配空间(未承诺的总空间0x2f38)。

区别在于,在第一种情况下, Arr在堆栈上声明; 直到函数被调用,该数组才存在。 生成的二进制文件包含用于创建数组的代码,但是数组本身不在二进制文件中。

但是,在第二种情况下, Arr在任何函数之外(也称为文件作用域)声明。 因此,它始终存在,并存储在二进制文件中。 因为您似乎正在嵌入式平台上工作,否则这种微不足道的差异会导致“ RAM溢出”错误。

在第二种情况下,在应用程序启动时分配数组。 它保留在内存中,直到应用程序退出。

在第一种情况下,仅在调用函数void Record(int16_t* current, int i,int n)时分配数组。 函数完成执行后,数组消失了。

如果您只有一个编译单元(.o文件),则static关键字不会有任何影响。

当创建.o文件时,全局变量(不是static )存在于链接器中,供其他文件使用。 因此,如果您有两个这样的文件,则会在上a名称冲突:

交流电:

#include <stdio.h>

int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

公元前:

int a;

int compute(void)
{
    a = 0;
    return a;
}

因为链接不知道哪个全局的a来使用s。

但是,当您定义静态全局变量时,您是在告诉编译器仅保留该文件的变量,而不让链接程序知道它。 所以,如果你添加static (以定义a )我写这两个示例代码,你不会得到名称冲突只是因为链接甚至不知道有一个a在这两个文件中:

交流电:

#include <stdio.h>

static int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

公元前:

static int a;

int compute(void)
{
    a = 0;
    return a;
}

这意味着每个文件都可以使用自己的a而无需了解其他文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM