静态变量 - C.

时间:2013-04-15 14:52:20

标签: c pointers memory static scope

我正在编写一个程序,它共享一个指向缓冲区的全局声明指针,该缓冲区可供程序中的所有函数使用。但是在某些情况下缓冲区不是必需的,因此指针保持为NULL,直到它通过逐个移动它的NULL状态进行初始分配。我还需要一个全局声明的整数来防止缓冲区溢出并在必要时重新分配。仅仅因为我正在编写这个程序进行练习,我希望在分配缓冲区时静态声明缓冲区大小整数。例如,此代码段将为缓冲区分配初始内存大小。

static char *buffer //(Globaly Declared) I know that the static part is implied I just want to put emphasis on it.

while(program has arguments to do)//Not actual code. I put this here to give an idea of where the statement is located
{
   //None relavant code here..


    if(buffer is necessary)//Not actual code. I put this here to give an idea of where the statement is located
    {
          if(buffer == NULL)
          {
             static unsigned int initial_value = 64;
             static unsigned int *buffer_size = &inital_value;

              if( (buffer = malloc(sizeof(char)*inital_value+1)) == NULL)
              {
                 perror("MALLOC ERROR");
                 return 1;
               }
           }
      }
 }

我有一些关于它是如何工作的问题(如果有的话)以及静态存储器的工作原理。

  • 我知道静态变量具有整个程序执行时间的寿命,但除非它们是全局声明的,否则它们的范围也是有限的。所以我的假设是需要一个指针来跟踪静态内存位置,但指针是否需要是静态的呢?

  • 何时静态分配内存?当if语句为真时或者在程序启动时简单地分配变量(如全局变量)

  • 变量的重新分配是否适用于我?如果指针只是静态声明但它指向的内存实际上是动态分配的(例如我的缓冲区(静态字符*缓冲区)),我该怎么办。

  • 这些听起来像是一个愚蠢的问题,但是必须是整数指针声明的无符号部分,我需要写(inital_value + 1)还是我只能写inital_value + 1(我不认为这很重要这里因为sizeof(char)是1,所以分配大小可以重写为1 * 64 + 1)并且终止NULL字节需要与数组的其余部分具有相同的类型(大小)。

2 个答案:

答案 0 :(得分:2)

指针是静态分配的,但它指向的内存是动态分配的,只有当if条件成立时才会这样。

为您处理“变量”(指针)的重新分配,但不会为您处理它指向的内存的释放。您需要free任何malloc

你可以写(initial_value + 1)或initial_value + 1.你是对的。终止的NULL字节确实需要与数组的其余部分相同的大小(字节/字符)。在C中,所有数组元素的大小都相同。您可能会发现(initial_value + 1)更能反映出来。

答案 1 :(得分:1)

static unsigned int initial_value = 64;
static unsigned int *buffer_size = &inital_value;

两者都将在第一次执行时初始化一次,并且它们位于全局内存中,在{}派生的范围内。