我正在尝试在我的实现中找到错误,在那里我将结构存储在另一个结构中,似乎无法访问存储的值。我定义了两个结构。
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));
}
我能错过什么?
答案 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;
也可能是错误的。 data
和keyValue
都在堆栈上分配。当您的Function
返回时,这些对象不再有效,因此将该指针存储在storageUnit-> buckets [0]中是没用的。您可能应该使用例如动态分配元素和密钥。的malloc()。