Доступ к структуре по неизвестному указателю на адрес памяти - C - PullRequest
0 голосов
/ 10 октября 2019

Предположим, мне дано (void *) ptr (мое базовое понимание - это указатель на область с неизвестным типом данных), переданное через параметр функции. Я пытаюсь выяснить, как получить доступ и проверить, если структура существует несколько адресов позади.

Чтобы уточнить, я работаю с большим массивом символов (не malloced) и ptr, переданный в функцию должен указыватьна адрес неопределенного типа данных в массиве. Перед этими данными расположена структура, к которой я пытаюсь получить доступ.

void function(void *ptr)
{
       void *structPtr = (void*)((void*)ptr - sizeof(struct block));
}

Будет ли это работать, чтобы получить указатель на адрес структуры, расположенной за начальным "ptr"? И если да, то как я могу проверить, является ли это структурой блока?

Заранее извиняюсь, я знаю, что этот код не является специфическим, поскольку я совершенно новичок в понятиях, но также я нахожусь в процессепридумать алгоритм и еще не реализовать его. Любые ссылки на возможно полезную информацию приветствуются.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

то, что вы пытаетесь сделать, рискованно, так как вы должны быть уверены, что обращаетесь к правильному месту в памяти. Обычно мы добавляем магическое число в структурный блок, чтобы мы могли проверить здесь, что мы никуда не денемся.

Этот шаблон обычно используется в распределителях памяти, посмотрите на https://sourceware.org/glibc/wiki/MallocInternals дляпример.

0 голосов
/ 11 октября 2019

Обычный способ написать это примерно так:

...function(void *ptr) {
    struct block *hdr = (struct block *)ptr - 1;

, опираясь на арифметику указателей, автоматически масштабируемую по размеру указанного на тип. Пока все указатели, переданные здесь, были изначально созданы путем взятия указателя на действительный struct block и добавления к нему 1 (чтобы получить память после него), у вас все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...