我有以下结构:
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 *)来获取给定单元格的开头?
答案 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;
}