2013-07-22 1 views
0

было бы хорошо, если бы функция была: void memcpy(char* dst, const char* src, size_t size)?Почему memcpy использует указатель void как параметр?

В чем преимущество использования указателей void в memcpy()?

+4

Да, вы можете. Это указатель на пустоту как уведомление, что вы можете передать любой указатель на него. Вам не нужно посылать char * или int *, вы можете отправить MyNewStruct *, и он будет копировать память одинаково. Но в любом случае, это то, что вы можете посмотреть буквально за 3 секунды. Боюсь, довольно бесполезный вопрос. – BrainSteel

+2

'void * memcpy()' return destination ... как вы получите данные с помощью 'void memcpy() '? – someone

+0

Данные @ Кришна готовы в * dst. Возвращение указателя на dst является обычным для цепочки вызовов функций, для меня это необязательно. – Deqing

ответ

4

До типа void данных был добавлен в стандарте 1989, что был как функции, такие как memcpy были разработаны. char * был самым близким к «универсальному» указателю в то время.

Проблема заключается в том, что если memcpy до сих пор используются char * аргументы и вы хотели назвать memcpy на цель, которая не является массивом char, вы должны явно привести значение указателя:

int foo[N]; 
int bar[N]; 
... 
memcpy((char *) foo, (const char *) bar, N * sizeof *foo); 

потому что вы не можете назначать указатели одного типа другому типу без броска. Это не было (как большая часть) проблемой в pre-ANSI C, потому что у вас не было прототипов функций; то есть компилятор не проверял, что количество и типы аргументов в вызове функции соответствуют определению, но это определенно проблема.

Однако, в отличие от других типов указателей объекта, вы можете присвоить любое T * значения void * и обратно без необходимости броска, поэтому memcpy вызова может быть записан в виде

memcpy(foo, bar, N * sizeof *foo); 

Я помню дни до стандартизации (хотя я все еще был в колледже). Кастинг гимнастики не был забавным. Объявите тип void *, потому что он спасет вас от изжоги.

2

было бы хорошо, если бы функция была: void memcpy (char * dst, const char * src, size_t size)?

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

В чем преимущество использования указателя void в memcpy()?

Избегайте приведения к типу указателя адресата.

2

В чем преимущество использования указателя void в memcpy()?

Указатель void является общим указателем, поэтому он может принимать указатель на любой тип.

+0

memcpy() ничего не возвращает. Вы, конечно, имели в виду «принять указатель любого типа». – Gil

+0

@Gil Да, это действительно то, что я хотел напечатать. Я исправлю это. – alex

+0

Я плюнул на ваш ответ, так как теперь он более краток, чем мой. – Gil

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

  • Нет связанных вопросов^_^