Как присвоить динамическому массиву типа void* значение в Си?
Реализую копирование массива любого типа, но не пройтись по адресам.
Последний вариант выглядит как костыль, т.к. тут мы показываем компилятору, что это указатель типа инт, но это же может быть произвольный тип - в таком случае, как происходит заполнение? С шагом байт, равных типу инт или войд?
Нельзя выделить память для произвольного типа, т.к. размер произвольного типа - произвольный. Память всегда выделяется конкретного размера.
В вашем примере вы выделяете память для двух указателей (void*). На всех распространенных платформах указатель, не важно на какой тип он ссылается, имеет один и тот же размер.
Нельзя сделать разъименование void*, т.к. это указатель с неопределенным типом - компилятор не знает какого типа данные лежат по адресу в указателе, а следовательно не может с ними корректно работать. Для нормальной работы нужно привести указатель к какому-нибудь типу и потом уже можно делать разъименование (ваш 3 пример).
Ваш пример не корректен для х64 платформы, т.к. sizeof(void*) там 8 байт, а sizeof(int) - 4 байта.
Вы mallocом выделяете 16 байт памяти (2 указателя), а в 3 присваивании (которое работает) присваиваете значение 10 старшей половине первого указателя. В общем выглядит как бред.
Для х32 - корректен, т.к. тут sizeof(void*) == sizeof(int)
Для копирования двух массивов произвольного типа и размера, нужно знать размер массива в байтах (не в элементах). Можно не знать тип, но знать размер необходимо - иначе ничего не поучится. Выделяете память заданного размера, приводите указатель к char* и побайтово копируете (memcpy).
Приводить к int* и копировать intы в этом случае нельзя, т.к. массив может быть, например 3 байта или 33, тогда при копировании через приведение к int* вы неминуемо выйдете за границу массива.
Данные выражения вызывают ошибку потому что sizeof(void) не определен. https://stackoverflow.com/questions/1666224/what-i...
Вы не можете скопировать массив не зная размер его элемента и количество элементов или исходный размер массива в байтах.
Собственно, потому memcpy и требует одним из параметров размер.
Пишу библиотеку, реализующую динамический массив. Вот пока исходники
rusyska55011, во-первых есть realloc ну или на край memcpy
во-вторых, неплохо бы хранить длину элемента, так как в типах этой информации нет
ну и в-третьих, перевыделять память на каждый push - это очень дорого, храните capacity и выделяйте память с запасом
malloc потому и возвращает void, потому что ответственность за то, какого типа будет массив - на программисте.
Если нужно заполнить его фиксированным значением - есть memset()
Если нужно заполнить нулями - обычное дело перед тем, как начать работу со строками - есть calloc()
Если нужно расписать его структурным типом - ну определи структуру, потом приведи массив к типу структуры и циклом пробегись
, где ptrArr - область памяти, способная хранить N указателей, т. е.
динамический массив (это понятие мне не нравится) из N указателей.
Вы просто где-то отдельно выделяете память для int'ов, char'ов, и т. д., и записываете указатели в этот массив, по необходимости расширяя его (тут, на мой взгляд, лучше проявит себя список).