Нужна помощь в понимании указателей и памяти на C - PullRequest
1 голос
/ 29 января 2010

Я пишу немного кода для класса, но, поскольку у меня нет опыта работы с C, я немного не уверен в том, что на самом деле делает код, который я написал. Особенно то, на что похожа память. Вот соответствующие биты:

typedef struct listnode *Node;
typedef struct listnode {
    void *data;
    Node next;
    Node previous;
} Listnode;

typedef struct listhead *LIST;
typedef struct listhead {
    int size;
    Node first;
    Node last;
    Node current;
} Listhead;

#define HALLOCSIZE 50

static LIST hallocbuf[HALLOCSIZE];
static LIST *hallocp = hallocbuf;

LIST *CreateList()
{
    if(hallocbuf + HALLOCSIZE - hallocp >= 1)
    {
        LIST temp;
        temp->size = 0;
        temp->first = NULL;
        temp->last = NULL;
        temp->current = NULL;

        *hallocp = temp;
        return hallocp;

    }else
        return NULL;
}

Итак, мой вопрос в том, как в функции CreateList программа распределяет память для temp? И копирует ли код *hallocp = temp временный LIST в массив hallocbuf? Я пытаюсь разместить все свои структуры LIST в выделенной памяти для hallocbuf. Это то, что я делаю? Я немного не уверен в том, как typedef, структуры и указатели играют вместе.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 29 января 2010

Итак, мой вопрос в функции CreateList, как программа выделяет память для temp?

Нет, это проблема. Это должно сделать что-то вроде этого:

temp = malloc(sizeof(Listhead));

И копирует ли код * hallocp = temp временный LIST в массив hallocbuf?

Копирует указатель, который был сохранен в temp, в первый элемент hallocbuf (при условии, что hallocp нигде не был изменен и все еще имеет значение, к которому он был инициализирован, указывая на hallocbuf[0]).

Обычно не стоит скрывать тот факт, что LIST и Node являются указателями на typedefs. Гораздо понятнее, где должна быть выделена свободная память, если очевидно, какие переменные являются указателями, и наличие явного * в объявлении переменной делает это понятным.

3 голосов
/ 29 января 2010

temp выделяется в пространстве, используемом для объектов с «автоматическим сроком хранения» - обычно это в стеке времени выполнения, но вам не нужно знать подробности. Пространство освобождается при выходе из блока, в котором оно было выделено (в вашем случае, когда вы нажимаете return).

Строка *hallocp = temp; действительно копирует значение temp в память, на которую указывает hallocp, то есть hallocbuf[0].

Проблема в том, что temp является просто указателем - и он не указывает на . Это называется «висячий указатель». Это означает, что когда вы пытаетесь получить доступ к тому, на что он указывает, у вас появляется ошибка. Это происходит в следующих строках:

temp->size = 0;
temp->first = NULL;
temp->last = NULL;
temp->current = NULL;

Вы не можете разместить свои структуры в памяти, выделенной для hallocbuf, потому что в ней нет места для структур - это просто массив указателей, а не массив структур.

0 голосов
/ 29 января 2010

Если СПИСОК был

typedef struct listhead LIST;

и вы получили доступ к температуре

temp.size = 0;
...

тогда

*hallocp++ = temp;

будет использовать hallocp в качестве указателя на буфер hallocbuf и помещать туда только что инициализированный элемент. Однако не самый лучший способ сделать это. Вы можете заменить temp на

hallocp->size = 0;
...
++hallocp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...