我如何投射这个指针
Posted
技术标签:
【中文标题】我如何投射这个指针【英文标题】:How do I cast this pointer 【发布时间】:2014-09-05 10:49:44 【问题描述】:我有以下结构:
struct Map
void* arr; // includes pointers to certain blocks of memory
int mem_block_count;
;
void* arr 保存指向内存中某些单元的指针。每个单元格都包含一个指向内存中另一个单元格的 void* 指针(作为链表)、一个 char* 字符串和一个具有自己大小的值。
您应该能够通过执行 arr[i] 其中 i 是一个索引来获取这些指向单元格的指针之一 - 对吗?
我正在尝试访问指向其中一个单元格的第一个指针,它可能是 arr[0]。然后,我想访问指向内存中下一个单元格的指针。但这是 void 类型。那么我该怎么做呢?为了访问 char*,我只是在内存中前进,然后执行 strcpy。但是我如何获得访问/取消引用下一个指针?
编辑:我还考虑将 void 指针转换为 int,但我不确定我会得到正确的值。比如:
int *next_pointer;
next_pointer = (int*) map->arr[i]
但是当我将 this 转换为 int 时,这不是保留指向指针的指针吗?如何正确取消引用指向指针的指针?
编辑 - 因为它是一个指针链表,我难道不能也执行类似的操作 - map->arr + index * sizeof(void*) 来到达给定单元格的开头吗?
【问题讨论】:
arr
总是指向同一种结构,还是不同的arr
可以指向不同的结构?
你需要指针指向:void **arr;
void *arr;
是单个指针,而不是“指针”。如果您的意思是它指向存储一些指针的内存块,那么您必须在取消引用之前提供这些详细信息。 void *
不记得它是从哪里来的。
@pmg 抱歉,指针指向哪里?
@MattMcNabb 所以 void *arr 指向内存中的第一个“单元”,并且由于每个单元都有一个指向其中下一个单元的指针,这就是它变成“数组”的方式
【参考方案1】:
您不能在 void
指针上使用数组索引,因为它实际上只是一个没有类型的通用指针。如果没有类型,则无法将正确的偏移量添加到基本内存地址。在使用数组索引之前,您必须将其转换为正确的结构:
((struct some_structure *) arr)[1]
【讨论】:
难道我也不能,因为它是一个指针链表,也可以执行类似的操作 - map->arr + index * sizeof(void*) 来到达给定单元格的开头吗? 【参考方案2】:你需要指向指针的指针。
#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;
【讨论】:
谢谢 - 这太棒了。但是,我如何取消引用指针以访问 void* 指针、char* 和指针中的单个指针指向的连续内存中的值? 访问void*
的内容是没有意义的。 void*
的内容属于void
类型。你不能对 void
类型的值做任何事情。
是的 - 但是我如何才能访问其他两个呢?我的印象是您需要了解一些关于 void* 的信息(可能只是大小)才能访问内存中的下两个元素?那么我怎么才能得到 char* 呢?
这就是为什么你需要指向指针的指针。您可以使用void**
的内容:它们只是指针。
所以你会从 void** 中取消引用一个指针,比如第一个指针,就像这样 - map->arr[0]。这给了我们第一个指针。然后你可以做一些指针算术,map->arr[0] + sizeof(void*) 来获取 char* src?然后从那里开始 strcpy?以上是关于我如何投射这个指针的主要内容,如果未能解决你的问题,请参考以下文章