Проблема с массивом / указателем - PullRequest
5 голосов
/ 06 июля 2011

Проходя через K & R, я тоже смотрю на следующий код:

#define ALLOCSIZE 1000
static char allocbuf[MAXLINE];
static char *allocp = allocbuf

char *alloc(int n){
       if (allocbuf+ALLOCSIZE-allocp>=n){
               allocp+=n;
               return allocp-n;
       }
       else { ... }

Боюсь, мой вопрос очень прост, но я не могу обойти «если».Какую ценность принимает allocbuf?Это массив символов, верно?Я оглянулся назад на материал массива в книге, но это не помогло.Первоначально allocp указывает на нулевой элемент массива, верно?

Ответы [ 4 ]

2 голосов
/ 06 июля 2011

allocbuf - это массив типа char [], но во многих случаях сам идентификатор распадается на указатель типа char *, содержащий начальный адрес массива.Обратите внимание, что это не означает, что allocbuf является указателем, это все еще массив.

Итак, условие оператора if выполняет некоторую арифметику указателя.

1 голос
/ 06 июля 2011

Несмотря на то, что они объявляются по-разному, как allocp, так и allocbuf являются массивами символов (char *) и эффективно выделяют точки на первом символе буфера после инициализации и после прохождения тела if, к одному и тому же адрес + количество выделенных байтов, и это число увеличивается с каждым новым циклом в теле «если». Подводя итог, он указывает на первый свободный символ в буфере. Строка «if», в которой вы застряли, предназначена для проверки, достаточно ли места для размещения n символов в allocbuf, статическом буфере. Эту строку можно разложить следующим образом:

char* static_buffer_beginning = allocbuf;
char* static_buffer_ending = static_buffer_beginning + MAXLINE;
int   nb_chars_still_available = static_buffer_ending - allocp;
if (nb_chars_still_available >= n) {

Меня просто смущает "ALLOCSIZE", который появляется в вашем коде: какова его ценность, откуда она взялась ?! Я предполагаю, что это опечатка или что-то в этом роде, и что ее значение равно MAXLINE, но хотелось бы быть уверенным, что не даст вам неправильный ответ.

0 голосов
/ 06 июля 2011

allocbuf является статическим массивом, фактически он указывает на первый элемент непрерывного набора символов (массив).allocp - еще один указатель на непрерывный массив, и вы можете изменить его значение, чтобы оно указывало на элементы массива.

0 голосов
/ 06 июля 2011

Думайте о allocbuf как о указателе на начало вашей RAM, скажем, 0. Тогда allocbuf + ALLOCSIZE будет указывать на конец вашей RAM. allocp указывает на конец выделенной области, где-то в середине вашей оперативной памяти. Так что allocbuf + ALLOCSIZE-allocp даст вам свободный объем памяти. Оператор if проверяет, меньше ли запрошенный размер выделения (n), чем доступная свободная память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...