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ステートメントがtrueの場合、またはプログラムの開始時に変数が単に割り当てられる場合(グローバル変数のように)

  • 変数の割り当て解除は処理されますか? ポインターが静的に宣言されているだけで、ポインターが指すメモリが実際に動的に割り当てられている場合はどうすればよいですか (たとえば、my buffer(static char *buffer))。

  • また、これらはばかげた質問のように聞こえるかもしれませんが、整数ポインター宣言の符号なし部分が必要ですか? (inital_value+1) と書く必要がありますか、それとも inital_value+1 と書くだけでいいですか?そのため、割り当てサイズは 1*64+1 として書き換えることができ、NULL バイトの終端は配列の残りの部分と同じ型 (サイズ) である必要があります。

4

2 に答える 2

2

The pointer is statically allocated, but the memory it points to is dynamically allocated, only when your if conditional holds true.

Deallocation of the "variable" (the pointer) is handled for you, but deallocation of the memory it points to is not handled for you. You will need to free anything you malloc.

You're right that you could write (initial_value+1) or initial_value + 1. The terminating NULL byte does need to be the same size (byte / char) as the rest of the array. In C, all array elements are the same size. You may find (initial_value+1) better reflects that.

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

Both will be initialized only once on the first execution and they are located on the global memory, within the scope derived by {}.

于 2013-04-15T14:55:35.597 に答える