0
votes

I have the following struct:

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

The void* arr holds pointers to certain cells in memory. Each cell holds a void* pointer to another cell in memory (as a linked list) a char* string, and a value with its own size.

You should be able to grab one of these pointers to a cell by doing arr[i] where i is an index - is this right?

I am trying to access the first pointer to one of these cells, which is probably arr[0]. Then, I want to get access to the pointer to the next cell in memory. But this is of void type. So how do I get at it? For getting access to the char*, I just move forward in memory, and then do a strcpy. But how do I get access/deref the next pointer?

EDIT: I also thought about casting the void pointer to an int, but I'm not sure I would get the right value. Something like:

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

But is this not preserving the pointer to the pointer when I cast this as an int? How do I dereference a pointer to a pointer correctly?

EDIT - Couldn't I also, because it is a linked list of pointers, also do something like - map->arr + index * sizeof(void*) to get to the start of a given cell?

2
Do arr always point to the same kind of structure, or can different arr point to different structures? - Some programmer dude
You need pointers to pointers: void **arr; - pmg
void *arr; is a single pointer, not "pointers". If you mean that it points to a block of memory in which some pointers are stored, then you have to supply those details before dereferencing. The void * does not remember from whence it came. - M.M
@pmg Sorry where would the pointer to pointer go? - user1697083
@MattMcNabb So the void *arr points to the first "cell" in memory, and since each cell has a pointer to the next cell in it, that's how it becomes something like an "array" - user1697083

2 Answers

1
votes

You can't use array indexing on a void pointer, as it really just a generic pointer without a type. And if there's no type then there's no way of adding the correct offset to the base memory address. You have to cast it to the correct structure before using array indexing:

((struct some_structure *) arr)[1]
0
votes

You need pointers to pointers.

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