[英]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.