2013-05-21 8 views
0

Я сам пытался сделать strcpy. Он должен работать, я даже скопировал и вставлял (почти точный код) из сообщения someones здесь около strcpy. Оба дают мне «Ошибка сегментации».Что случилось с моей strcpy?

char* strcpy(char * destination, const char * source) 
{ 
    while((*destination++ = *source++) != '\0') 
     ; 
    return destination; 
} 

Что не так с этим кодом?

char* a = "hello"; 
cout << strcpy(a, "Haha") << endl; 
+5

Показать код, на который требуется эта функция. –

+16

Моя ставка заключается в том, что это называется w/string literal as destination –

+0

Почему C++ 03 не запретил строковые литералы 'char *' :( – chris

ответ

4

Вы пытаетесь выполнить запись в сегмент данных, так как там хранится "hello".

Поэтому, когда вы вызываете strcpy, вы получаете ошибку сегментации.

Try:

char a[] = "hello"; 
cout << strcpy(a, "Haha") << endl; 

вместо этого.

EDIT: Внутри вашей функции strcpy после копирования destination укажет на конец строки, вам нужно вместо этого начать начало строки.

3

a является указателем на строку буквального:

char* a = "hello"; 

Попытка изменить строку литерал неопределенное поведение. Как предположил Карл, если инициализировать массив строкового литерала вместо этого он будет работать:

char a[] = "hello" ; 
+0

@ dmckee Yup, был в процессе этого :-) –

6

Вы пытаетесь перезаписать строку литерал. Это вызывает неопределенное поведение. Объявить a как массив вместо:

char a[] = "hello"; 

Вашей strcpy реализация имеет ошибку, тоже (при условии нормальной семантики). Он должен вернуть указатель на начало буфера назначения, а не конец.

3

Помимо всего, что указано выше и ниже о строковых литералах, вы также возвращаете указатель на строку END, поэтому, даже если вы избегаете ошибки сегментации, вы будете печатать «».

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