почему segmentation fault при копировании памяти

Я запускаю ubuntu на x86_32 … и я продолжаю получать ошибку сегментации во время запуска этой программы.

enter code here #include #include char *memcp(char *dest, const char *src, size_t n) { char *dp = dest; const char *sp = src; while(n--) *dp++ = *sp++; return dest; } int main() { char *s = "abcde"; char *d; char *r = memcp(d,s,6); printf("%s",r); return(0); } 

Проблема с этим кодом заключается в том, что он работает на компьютере x86_64 моего друга на windowsх, а также на ubuntu. Пожалуйста, помогите мне.

Существует по крайней мере два способа сделать это:

Метод 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; } 

Обратите внимание, что обычно не рекомендуется записывать длинные длины буфера кода в код (например, вы являетесь hardcoding 6). Если размер вашего ввода изменяется, и вы забываете обновить номер 6, проблемы будут возникать.

Причина, по которой вы получаете ошибку сегментации, заключается в том, что указатель d не указывает нигде. В вашей функции memcp вы пытаетесь записать этот указатель, но поскольку он не указывает на то, что ваша программа выйдет из строя. В стандарте C это называется неопределенным поведением , и в основном это означает, что все может случиться.

Кроме того, может вас заинтересовать, что в библиотеке Standard C, memmove и memcpy уже есть две функции. memmove полезен, если области источника и назначения перекрываются. Если вы знаете, что они никогда не будут перекрываться, memcpy может быть быстрее.

Наконец, я хотел бы указать, что вы не должны брать совет от Артура относительно использования неинициализированного указателя. Вы никогда не должны полагаться на значение неинициализированного указателя, и это означает, что поведение вашей программы не определено корректно. В приложении J спецификации языка C упоминается следующее, что является неопределенным поведением :

J.2 Неопределенное поведение

  1. Поведение не определено в следующих случаях:
    • Значение объекта с автоматической продолжительностью хранения используется, пока оно неопределено.