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