Я пишу код очень низкого уровня для эмулирования «файловой системы» для домашнего проекта. Файловая система состоит из блоков фиксированного размера (1024B), но «файлу» разрешено охватывать несколько не последовательных блоков.Указатель Арифметика и чтение/запись в C
Мне нужно написать любой тип void *buf
в файл с функцией, имитирующей write
. Допустим, у нас есть следующая подпись: myWrite(int blockNum, void *buf, int nbytes
.
Скажем, nbytes
больше, чем 1024
, поэтому мне приходится писать в несколько блоков. Так что я должен был бы сделать что-то вроде:
int remainder = nbytes - 1024;
myWrite(firstBlock, buf, 1024);
myWrite(nextBlock, (buf + 1024), remainder);
myWrite
вызывает стандартную функцию write
снизу, проходя в подобных аргументов.
Проблема с арифметикой указателя, C не нравится, когда я выполняю арифметику указателя на void*
. Я получаю EINVAL
или EARGS
(в зависимости от Mac против Linux), говорящий, что C не любит указатель, который я передал системному вызову write
, так как он был создан с помощью арифметики указателей void
.
Проблема в том, что я не знаю, какой тип данных я буду писать. Иногда это char *
, а иногда это что-то обычное, как my_type *
, которое представляет собой структуру из кода программы.
Есть ли способ обойти это? Мне нужно, чтобы обобщенная запись была такой. Моя текущая реализация работает большую часть времени, но иногда она терпит неудачу.
Предполагая, что 'buf' объявлен как' void * ', а' 1024' - это количество байтов, тогда '(unsigned char *) buf + 1024' должно быть ОК. – ouah
Будет ли это работать для любого типа данных? –
Если вы просто пишете байты, базовый тип не имеет значения. – codnodder