0

我正在编写一个程序,该程序共享一个全局声明的指向缓冲区的指针,程序中的所有函数都可以使用该缓冲区。但是在某些情况下缓冲区不是必需的,因此指针保留为 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 语句为真或程序启动时将简单地分配变量(如全局变量)

  • 是否为我处理了变量的释放?如果指针只是静态声明但它指向的内存实际上是动态分配的(例如我的缓冲区(静态字符 * 缓冲区)),我该怎么办。

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

4

2 回答 2

2

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

“变量”(指针)的释放是为您处理的,但它指向的内存的释放不是为您处理的。您将需要free任何东西malloc

没错,您可以写 (initial_value+1) 或 initial_value + 1。终止的 NULL 字节确实需要与数组的其余部分具有相同的大小(字节/字符)。在 C 中,所有数组元素的大小相同。您可能会发现 (initial_value+1) 更好地反映了这一点。

于 2013-04-15T14:55:20.340 回答
1
static unsigned int initial_value = 64;
static unsigned int *buffer_size = &inital_value;

两者都只会在第一次执行时初始化一次,并且它们位于全局内存中,在{}.

于 2013-04-15T14:55:35.597 回答