Есть как минимум два способа сделать это:
malloc
метод:
int main(void)
{
char *s = "abcde";
char *d = malloc(6);
char *r = memcp(d, s, 6);
printf("%s",r);
free(d);
return(0);
}
Метод массива:
int main(void)
{
char *s = "abcde";
char d[6];
memcp(d, s, 6);
return 0;
}
Обратите внимание, что обычно это не такхорошая идея жестко закодировать длину буфера в ваш код (например, вы жестко программируете 6).Если размер вашего ввода изменится, и вы забудете обновить число 6. Возникнут проблемы.
Причина, по которой вы получаете ошибку сегментации, заключается в том, что указатель d
никуда не указывает.В вашей функции memcp
вы пытаетесь написать этот указатель, но поскольку он нигде не указывает на значимый сбой вашей программы.В стандарте C это называется неопределенное поведение , и в основном это означает, что все может произойти.
Кроме того, вас может заинтересовать то, что в стандартной библиотеке C уже есть две функции,memmove
и memcpy
.memmove
полезно, если области источника и назначения перекрываются.Если вы знаете, что они никогда не будут перекрываться, memcpy
может быть быстрее.
Наконец, я хотел бы отметить, что вам не следует принимать советы от Артура в отношении использования неинициализированного указателя.Вы никогда не должны полагаться на значение неинициализированного указателя, и это означает, что поведение вашей программы не четко определено.В приложении J спецификации языка C упоминается следующее: неопределенное поведение :
J.2 Неопределенное поведение
- Поведение не определено вследующие обстоятельства:
- …
- Значение объекта с автоматической продолжительностью хранения используется, пока оно не определено.
- …