С указатель махинаций - PullRequest
2 голосов
/ 18 июня 2011

Я пытаюсь реализовать очередь в C (используя связанный список) для хранения указателей на данные.Кажется, что работа в очереди работает нормально, но есть некоторые проблемы с указателями при выходе из очереди.

В моем main ():

void* data = malloc(sizeof(int));
dequeue(&Q, data);
printf("(%d) %d\n", k, *(int*)data);

dequeue ():

int dequeue(struct queue *q, void *value)
{
    struct queue_node *tmp;

    if (!q->first) {
        value = 0;
        return 1;
    }
    value = q->first->data;
    tmp = q->first;
    if (q->first == q->last)
        q->first = q->last = NULL;
    else
        q->first = q->first->next;

    free(tmp);
    return 0;
}

Исходя из моей отладки, кажется, что значение указателя * данных вцикл main () for не сохраняет значение, установленное в dequeue ().Чего мне не хватает?

Редактировать:

struct queue_node
{
    struct queue_node *next;    
    void* data;
};

struct queue
{
    struct queue_node *first;
    struct queue_node *last;
};

Ответы [ 3 ]

3 голосов
/ 18 июня 2011

queue_node data содержит указатель на какое-то значение (здесь это int, но оно может быть не всегда истинным, в противном случае вы бы вместо этого использовали int ...)

Так как это значение было присвоено с malloc (и не является локальной переменной), вам необходимо также освободить его в некоторый момент.

Итак, измените сигнатуру функции, чтобы она принимала void**, не выделяйте место для int in main(), а вызывайте dequeue с &data в качестве параметра, где void * data = 0. Не забудьте free данные, когда закончите. В dequeue установите *value = q->first->data.

3 голосов
/ 18 июня 2011

Вы устанавливаете значение переменной "value", которая является указателем, локальным для функции.

Если вы хотите установить значение, на которое он указывает, используйте:

*value = 0; 

и

*value = q->first->data;

Редактировать (после редактирования вопроса): поскольку queue_node.data сама по себе является указателем, имеет смысл передавать пустое значение **, как @Andrei отмечает выше.

0 голосов
/ 18 июня 2011

Предполагая, что данные являются (void *), и вы хотите, чтобы значение (int) указывало на данные, вам придется заменить

value = q->first->data;

на

*(int *)value = *(int *)q->first->data;

в функции deque ();

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