2013-04-15 3 views
0

Я пишу программу, которая разделяет объявленный глобальный указатель на буфер, который может использоваться всеми функциями внутри программы. Но буфер в некоторых случаях не нужен, поэтому указатель остается NULL, пока он не будет выделен, если будет установлен статус NULL. Мне также требуется глобальное объявленное целое число, чтобы предотвратить переполнение буфера и при необходимости перераспределить его. Просто потому, что я пишу эту программу для практики, я хочу, чтобы целое число размера буфера было объявлено статически, когда выделен буфер. Например, этот сегмент кода выделил бы размер памяти для буфера.Статические переменные - C

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; 
       } 
      } 
     } 
} 

У меня есть несколько вопросов о том, как это работает (если есть) и как работает статическая память.

  • Я знаю, что статические переменные имеют срок службы всего времени выполнения программы, но если они не globaly заявили, что они имеют ограниченную область применения, а также. Итак, мое предположение заключается в том, что указатель необходим для отслеживания местоположения статической памяти, но должен ли быть указатель также статическим?

  • Когда будет распределяться память по типу памяти? Если значение if истинно или переменная будет просто распределена при запуске программы (например, глобальные переменные)

  • Является ли освобождение переменной для меня? Что делать, если указатель просто объявлен статически, но память, на которую он указывает, фактически распределяется динамически (например, мой буфер (статический буфер char)).

  • Также они могут звучать как глупые вопросы, но это неподписанная часть декларации целочисленного указателя, необходимо ли мне писать (inital_value + 1) или я могу просто написать inital_value + 1 (я не думаю, что это имеет значение здесь потому что sizeof (char) один, поэтому размер выделения может быть переписан как 1 * 64 + 1), и завершение NULL-байтов должно быть того же типа (размера), что и остальная часть массива.

ответ

2

Указатель статически выделяется, но память, на которую он указывает, динамически распределяется, только если выполнено условие if if.

Освобождение «переменной» (указатель) обрабатывается для вас, но освобождение памяти, на которую указывает точка, не обрабатывается для вас. Вам нужно будет free что угодно вы malloc.

Вы правы, что можете писать (initial_value + 1) или initial_value + 1. Заканчивающий байт NULL должен быть того же размера (байт/символ), что и остальная часть массива. В C все элементы массива имеют одинаковый размер. Вы можете найти (initial_value + 1), что лучше отражает это.

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

Оба будут инициализированы только один раз на первом исполнении, и они расположены на глобальной памяти, в пределах объема, полученного с помощью {}.