我如何投射这个指针

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?

以上是关于我如何投射这个指针的主要内容,如果未能解决你的问题,请参考以下文章

将一组指针投射到其他对象?

我如何添加光线投射统一命中的对象并将它们添加到列表中

使用光线投射的对象拾取

断开发送方投射设备后,如何让我的 android 电视应用程序继续运行?

如何旋转/取消旋转(投射/融化)数据框? [复制]

如何从颤振应用程序中投射屏幕?