определение элементарной функции alloc - PullRequest
0 голосов
/ 02 июля 2018

это пример в книге K & R ch5 , этот пример - определение функции alloc, которую я получил, но я застрял и не смог понять, почему он возвращает старый указатель, и в первом утверждении allocp += n; он увеличивает allocp затем он уменьшает его allocp - n это мой первый вопрос, также я не могу понять, если блок условия

if(condition is true)
 do something;

когда он пишет оператор return, так что если роль будет завершена и вернет старый указатель, и выполните один цикл. и не может добраться до всех n сегментов. Мой второй вопрос это правда, что записать возвращение внутри if, а не записать его из блока if? это весь код

#define ALLOCSIZE 1000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;
char *alloc(int n)
{
    if(allocbuf + ALLOCSIZE - allocp >= n ) // it fits
    {
        allocp += n;
        return allocp - n; // old p 
    }else
        return 0;

}

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Отправленный вами фрагмент кода -

  1. Имеет статический буфер в 1000 байт, представленный

    static uint8_t allocbuf [ALLOCSIZE];
    
  2. Когда пользователь запрашивает «n» байтов с помощью вызова alloc (), он проверяет, достаточно ли памяти доступно (если запрос помещается в 1000 байтов) и возвращает указатель, указывающий на начало этого запрос на выделение. (может быть несколько запросов на выделение).

  3. Во второй раз, когда вы вызываете alloc, вы видите, как указатель allocp уже указывает на (конечный адрес + 1) -й байт последнего запроса на выделение? (Если вы этого не видите, я предлагаю вам прочитать, что делает ключевое слово static) Итак, ваше новое распределение начинается с allocp, если это допустимо. В противном случае возвращается NULL.

Если вы новичок в программировании, как предложил Jabberwocky , имейте карандаш и бумагу и выполняйте математику с помощью нескольких вызовов alloc. Вы даже можете использовать операторы printf в alloc () и вывести значение allocp до его возвращения, через несколько итераций и посмотреть, что произойдет.

И да, нормально возвращаться из любой точки функции.

0 голосов
/ 02 июля 2018

Функция предположительно выделяет память и возвращает указатель на выделенный сегмент, тогда как allocp просто используется для отслеживания того, сколько памяти было выделено.

Можно возвращаться изнутри оператора if, хотя, как правило, следует избегать нескольких операторов возврата из одной и той же функции.

Вы можете переписать функцию как-то так, что, возможно, более понятно:

#include <stdint.h>

#define ALLOCSIZE 1000
static uint8_t allocbuf [ALLOCSIZE];
static size_t alloc_size = 0;

uint8_t* alloc (size_t n)
{
  uint8_t* result = NULL; 

  if(alloc_size + n < ALLOCSIZE)
  {
    result = allocbuf + alloc_size;
    alloc_size += n;
  }

  return result;
}
...