我正在尝试将字符串存储在结构中包含的数组中,然后访问它,但是我很难过。结构看起来像这样:
typedef struct {
void **storage;
int numStorage;
} Box;
Box初始化为:
b->numStorage = 1000000; // Or set more intelligently
Box *b = malloc(sizeof(Box));
// Create an array of pointers
b->storage = calloc(b->numStorage,sizeof(void *));
为了设置字符串,我使用这个函数:
void SetString(Box *b, int offset, const char * key)
{
// This may seem redundant but is necessary
// I know I could do strcpy, but made the following alternate
// this isn't the issue
char * keyValue = malloc(strlen(key) + 1);
memcpy(keyValue, key, strlen(key) + 1);
// Assign keyValue to the offset pointer
b->storage[offset*sizeof(void *)] = &keyValue;
// Check if it works
char ** ptr = b->storage[offset*sizeof(void *)];
// It does
printf("Hashcode %d, data contained %s\n", offset, *ptr);
}
问题在于当我尝试再次检索它时,具有完全相同的偏移量:
// Return pointer to string
void *GetString(const Box *b, int offset, const char *key)
char ** ptr = b->storage[offset*sizeof(void *)];
if (ptr != NULL) {
printf("Data should be %s\n", *ptr);
return *ptr;
} else {
return NULL;
}
返回的指针是胡言乱语。可能有什么不妥?
答案 0 :(得分:2)
访问数组时,不必指定实际的内存偏移量。只需给它索引,你就会得到正确的元素。
所以,在你的第三个代码块中:
b->storage[offset] = keyValue;
在你的第四个:
char *ptr = b->storage[offset];
if (ptr != NULL) {
printf("Data should be %s\n", ptr);
return ptr;
} else {
return NULL;
}
此外,在第二个代码块中,是否已设置b->numStorage
?
答案 1 :(得分:2)
b->storage[offset*sizeof(void *)] = &keyValue;
这会将局部变量keyValue
的地址存储在数组中。函数完成后,该地址将变为无效。我想你想要:
b->storage[offset*sizeof(void *)] = keyValue;
然后在检索时进行相应的更改。
答案 2 :(得分:1)
这不是:
b->storage[offset*sizeof(void *)] = &keyValue
将storage [offset * sizeof(void *)]设置为指向局部变量keyValue的地址?即函数返回后不再有效