Доступ к void * struct - PullRequest
       23

Доступ к void * struct

1 голос
/ 24 апреля 2011

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

typedef struct {
    void * data;

} Element;

typedef struct {
    void **buckets;
} Storage;

В отдельной функции я устанавливаю key как указатель на char.И передать его для хранения в данных.

void Function(const char *key, Storage *storageUnit)
{
    char keyValue[strlen(key) + 1];
    strcpy(keyValue, key); // To fix the discard qualifiers bit
    Element data = { keyValue }; // = new struct element;
    printf("Key %s\n", (char *)data.data); // This works.
    *(storageUnit->buckets) = &data;

    // Let's see if it got stored correctly?
    Element temp = *(Element *)(storageUnit->buckets);

    // This is gobbledygook
    printf("Stored correctly with data %s", (char *)(temp.data));
}

Чего мне не хватать?

Ответы [ 3 ]

2 голосов
/ 24 апреля 2011

изменить

Element temp = *(Element *)(storageUnit->buckets);

на

Element *temp = (Element *)*(storageUnit->buckets);

и вывести выписку из

printf("Stored correctly with data %s", (char *)(temp.data));

в

printf("Stored correctly with data %s", (char *)(temp->data));

РЕДАКТИРОВАТЬ
Не уверен, что это хороший способ сделать это, но я уверен, что вы можете изменить

Element temp = *(Element *)(storageUnit->buckets);

на

Element temp = *(Element *)*(storageUnit->buckets);

Без изменения оператора печатии получи такое же поведение.

0 голосов
/ 24 апреля 2011

char keyValue[strlen(key)]; неверно, так как вы используете strcpy, вы должны учитывать нулевой терминатор.сделать это char keyValue[strlen(key) + 1];.Вероятно, это является причиной вашей проблемы в последнем printf.

*(storageUnit->buckets) = &data; также может быть неправильным.data и keyValue оба размещены в стеке.Когда ваш Function возвращает, эти объекты больше не действительны, поэтому хранить этот указатель в storageUnit-> buckets [0] бесполезно.Вероятно, вам следует динамически распределять элемент и ключ, например, с помощью malloc ().

0 голосов
/ 24 апреля 2011

Я думаю, может быть, вы немного объединили свои публикации? в какой-то момент это storageUnit-> buckets, а затем cm-> buckets. Это заставляет меня думать, что последняя печать на самом деле находится за пределами функции, и в этом случае она будет взорвана, потому что данные Element - это локальная переменная, которая исчезает при возврате Function (). Вы добавили автомат в свой контейнер.

Я думаю, ты хочешь Данные элемента = новый элемент (); data.data = keyValue;

...