访问void * struct

时间:2011-04-24 00:47:35

标签: c pointers struct c99

我正在尝试在我的实现中找到错误,在那里我将结构存储在另一个结构中,似乎无法访问存储的值。我定义了两个结构。

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 个答案:

答案 0 :(得分:2)

更改

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);

不改变print语句并获得相同的行为。

答案 1 :(得分:0)

我想也许你巩固了你的帖子了吗?在某一点上它是storageUnit->桶,然后它是cm->桶。这让我觉得后面的打印实际上是在函数之外,在这种情况下它会爆炸,因为Element数据是一个局部变量,一旦Function()返回就会消失。您已在容器中添加了自动。

我想你想要     元素数据= new Element();     data.data = keyValue;

答案 2 :(得分:0)

char keyValue[strlen(key)];错误,因为你使用strcpy,你必须考虑nul终止符。把它char keyValue[strlen(key) + 1];。这可能是导致您在最后一次打印中出现问题的原因。

*(storageUnit->buckets) = &data;也可能是错误的。 datakeyValue都在堆栈上分配。当您的Function返回时,这些对象不再有效,因此将该指针存储在storageUnit-> buckets [0]中是没用的。您可能应该使用例如动态分配元素和密钥。的malloc()。