在struct中分配和访问指向字符串的指针

时间:2011-04-24 17:18:41

标签: c pointers c99 struct memcpy

我正在尝试将字符串存储在结构中包含的数组中,然后访问它,但是我很难过。结构看起来像这样:

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

返回的指针是胡言乱语。可能有什么不妥?

3 个答案:

答案 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的地址?即函数返回后不再有效