如何投射此指针

时间:2014-07-15 09:43:22

标签: c pointers

我有以下结构:

    struct Map {
    void* arr; // includes pointers to certain blocks of memory
    int mem_block_count;
    };

void * arr保存指向内存中某些单元格的指针。每个单元格都有一个void *指针指向内存中的另一个单元格(作为链接列表)char *字符串,以及一个具有自己大小的值。

你应该能够通过做arr [i]来获取这些指针中的一个指针,其中我是一个索引 - 这是对的吗?

我正在尝试访问其中一个单元格的第一个指针,这可能是arr [0]。然后,我想访问指向内存中下一个单元格的指针。但这是无效的类型。那么我该怎么做呢?为了访问char *,我只是在内存中向前移动,然后执行strcpy。但是如何获取/解析下一个指针?

编辑:我还想过将void指针转换为int,但我不确定我会得到正确的值。类似的东西:

    int *next_pointer;
    next_pointer = (int*) map->arr[i]

但是当我将它作为int转换时,这是不是保留了指针的指针?如何正确取消引用指针指针?

编辑 - 我也不能,因为它是指针的链接列表,也可以执行类似 - map-> arr + index * sizeof(void *)来获取给定单元格的开头?

2 个答案:

答案 0 :(得分:1)

您不能在void指针上使用数组索引,因为它实际上只是没有类型的通用指针。如果没有类型,则无法向基本内存地址添加正确的偏移量。在使用数组索引之前,必须将其强制转换为正确的结构:

((struct some_structure *) arr)[1]

答案 1 :(得分:0)

你需要指针指针。

#include <stdio.h>
#include <stdlib.h>

struct Map {
    void **arr; // includes pointers to certain blocks of memory
    int mem_block_count;
};

int main(void) {
    struct Map map = {0};
    int a1[100];
    double a2[100];
    char a3[100];

    map.arr = malloc(3 * sizeof *map.arr);
    if (!map.arr) /* error */;

    a1[42] = 42;
    a2[42] = 42;
    a3[42] = 42;
    map.mem_block_count = 3;
    map.arr[0] = a1;
    map.arr[1] = a2;
    map.arr[2] = a3;

    printf("%d %f %c\n", ((int *)(map.arr[0]))[42],
                         ((double *)(map.arr[1]))[42],
                         ((char *)(map.arr[2]))[42]);

    free(map.arr);

    return 0;
}