簡體   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