2014-07-15 1 views
0

Я имею следующую структуру:Как я бросил этот указатель

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

Пустота * обры держат указатели на определенные клетки в памяти. Каждая ячейка содержит указатель void * на другую ячейку в памяти (в виде связанного списка) строку char * и значение со своим размером.

Вы должны уметь захватить один из этих указателей в ячейку, сделав arr [i], где i - индекс - это правильно?

Я пытаюсь получить доступ к первому указателю на одну из этих ячеек, что, вероятно, arr [0]. Затем я хочу получить доступ к указателю на следующую ячейку памяти. Но это недействительный тип. Итак, как мне добраться до него? Для получения доступа к char *, я просто перемещаюсь в памяти, а затем выполняю strcpy. Но как мне получить доступ/отменить следующий указатель?

EDIT: Я также подумал о том, чтобы наложить указатель на void на int, но я не уверен, что получаю правильное значение. Что-то вроде:

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

Но разве это не сохраняет указатель на указатель, когда я использую это как int? Как правильно разыскать указатель на указатель?

EDIT - Не мог я также, потому что это связанный список указателей, также сделать что-то вроде: map-> arr + index * sizeof (void *), чтобы добраться до начала данной ячейки?

+0

Действительно ли 'arr' всегда указывает на тот же тип структуры или может различать точку' arr' для разных структур? –

+0

Вам нужны указатели на указатели: 'void ** arr;' – pmg

+0

'void * arr;' - это единственный указатель, а не «указатели». Если вы имеете в виду, что это указывает на блок памяти, в котором хранятся некоторые указатели, тогда вы должны предоставить эти данные перед разыменованием. 'Void *' не помнит, откуда он пришел. –

ответ

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; 
} 
+0

Спасибо - это отлично. Как бы я разыменовал указатель, чтобы получить доступ к указателю void *, char * и значению в смежной памяти, на который указывает отдельный указатель в указателях? –

+1

Нет смысла обращаться к содержимому 'void *'. * Содержимое 'void *' имеет тип 'void'. Вы ничего не можете сделать со значениями типа 'void'. * – pmg

+0

Правильно - но как бы мне получить доступ к другим двум тогда?У меня создалось впечатление, что вам нужно знать что-то о void * (возможно, только о размере), чтобы добраться до следующих двух элементов в памяти? Итак, как мне добраться до символа char *? –

1

Вы не можете использовать индексирование массива на указателе void, так как это действительно просто общий указатель без типа. И если нет никакого типа, тогда нет способа добавить правильное смещение к адресу базовой памяти. Перед использованием индексации массива необходимо направить его на правильную структуру:

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

Не мог я также, потому что это связанный список указателей, также сделать что-то вроде: map-> arr + index * sizeof (void *), чтобы добраться до начала данной ячейки? –

Смежные вопросы