2015-12-19 1 views
0

Я хочу скопировать биты из одной пустоты * в другую void *.Назначение из указателя void на другой указатель void

Как я могу это сделать?

Я попытался это:

static void* copyBlock(void* ptr) { 
    if (!ptr) { 
     return NULL; 
    } 
    int sizeOfBlock=*(int*)ptr+13; 
    void* copy = malloc(sizeOfBlock); 
    if (!copy) { 
     return NULL; 
    } 
    for(int i=0;i<sizeOfBlock;i++){ 
     *(copy+i)=*(ptr+i); 
    } 
    return copy; 
} 

, но я получаю: invalid use of void expression

+0

Просто используйте болотную стандарт 'тетсру (3)' – vonbrand

ответ

1

Эта конструкция (сохранение размера блока внутри блока без какой-либо структуры) представляется опасным для меня, но я до сих пор знаю ответ.

*(copy+i)=*(ptr+i); 

Здесь вы получите сообщение об ошибке, потому что вы не можете разыменовать указатель на пустоту. Вам нужно наложить его на указатель на что-то раньше. Как это:

((char *)copy)[i] = ((char *)ptr)[i]; 
+0

, но я не знаю, какие данные, сохраненные в блоке. Это может быть, например, int. Итак, как я могу разыменовать его в char *? –

+0

@OhadShamir Вы всегда можете использовать любой указатель на указатель на char и разыгрывать его. Подумайте об этом, char всегда есть один байт. Вы не можете назначить * mysterious void * на C, вы можете назначить байты и другие типы. – HolyBlackCat

0

Вы должны использовать memcpy функцию:

memcpy(copy, ptr, sizeOfBlock); 

В зависимости от настроек компилятора (вы можете компилировать в C++, а не C), вам, возможно, придется отливать указатели указатель голец:

memcpy((char *) copy, (const char *) ptr, sizeOfBlock); 

Примечание: параметр функции должен быть const char *ptr, чтобы убедиться, что вы не меняете содержимое ptr по ошибке.

+2

Никакой совместимый компилятор C не потребует отбрасывания аргументов к 'memcpy'. (C++ делает, но вопрос помечен C.) –

+0

True. Я добавил этот комментарий, если он говорил о C в среде C++. Вы никогда не знаете ... –

+0

Что вы подразумеваете под «C в среде C++»? Если вы говорите о совместимости с C++ (и IMHO нет никакой реальной причины), вы должны упомянуть об этом в своем ответе. Но при написании кода C нет необходимости учитывать ограничения на C++, за исключением случаев * редких случаев, когда вам нужен код для компиляции как C, так и C++. –

3

Вы не можете разыменовывать, выполнять арифметику указателя, индексируя указатель на пустоту, поскольку он не имеет базового типа или размера объекта. Поэтому вы должны направить указатель void на указатель на тип копируемых единиц данных, чтобы компилятор знал размер копируемых данных.

Все, что сказал, вы бы лучше использовать:

memcpy(copy, prt, sizeOfBlock) ; 
Смежные вопросы