局部变量和静态变量

时间:2014-08-14 14:34:04

标签: c variables static ram

我只是想了解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];
}

这是消息:

  

无法为估计总数的部分/块分配空间   最小大小为0x330b字节(最大对齐0x8)   百分比抑制率0x200000c8-0x200031ff] GT; (未提交的总空间0x2f38)。

2 个答案:

答案 0 :(得分:1)

不同之处在于,在第一种情况下,在堆栈上声明了Arr;在调用该函数之前,该数组不存在。生成的二进制文件包含用于创建数组的代码,但数组本身不在二进制文件中。

然而,在第二种情况下,Arr在任何函数之外声明(也称为文件范围)。因此,始终存在,并存储在二进制文件中。因为您似乎正在使用嵌入式平台,所以这种微不足道的差异会导致您的内存溢出&#34;错误。

答案 1 :(得分:1)

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

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

如果您只有一个编译单元(.o文件),

static关键字不会产生任何影响。

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

交流转换器:

#include <stdio.h>

int a;

int compute(void);

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

b.c:

int a;

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

因为链接器不知道要使用哪个全局a

但是,当您定义静态全局变量时,您告诉编译器仅为该文件保留变量,并且不要让链接器知道它。因此,如果您将static(在a的定义中)添加到我编写的两个示例代码中,您就不会因为链接器甚至不知道存在名称冲突而导致名称冲突任一文件中的a

交流转换器:

#include <stdio.h>

static int a;

int compute(void);

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

b.c:

static int a;

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

这意味着每个文件都使用自己的a而不知道其他文件。