2013-05-21 2 views
0

나는 strcpy 자신을 만들려고 노력했다. 그것은 작동해야합니다, 심지어 복사하여 붙여 넣기 (거의 정확한 코드) 누군가 여기에서 게시 strcpy에 대해. 둘 다 나에게 "분할 오류"를줍니다.내 strcpy에 문제가 있습니까?

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

이 코드의 잘못된 점은 무엇입니까? 리터럴 문자열을 수정하려고

char* a = "hello"; 

이 정의되지 않은 동작입니다 :

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

이 함수를 호출하는 코드를 표시하십시오. –

+16

내 베팅'문자 *'문자열 리터럴은 :(뿐만 아니라 –

+0

리터럴 문자열 승/호출되고 있음을, 즉 너무 내 생각 엔. 그리고 영업 이익의 편집 확인한다이었다. – chris

답변

4

거기에 "hello"이 저장되어 있기 때문에 데이터 세그먼트에 쓰기를 시도하고 있습니다.

따라서 strcpy으로 전화하면 세그먼트 화 오류가 발생합니다.

보십시오 : 대신

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

.

편집 : strcpy 함수 내에서 복사 후 destination이 문자열의 끝을 가리킬 것이므로 대신 문자열의 시작 부분을 반환해야합니다.

3

a 리터럴 문자열에 대한 포인터입니다. 칼이 제안한 것처럼 당신이 리터럴 문자열 배열을 초기화하는 경우, 대신 작동합니다 : 당신은 리터럴 문자열을 덮어 쓰기 위해 노력하고

char a[] = "hello" ; 
+0

@dmckee 그래, 그렇게하는 과정에 있었다 :-) –

6

. 이로 인해 정의되지 않은 동작이 발생합니다. 대신 배열로 a 선언

char a[] = "hello"; 

strcpy 구현도 버그 (일반적인 의미를 가정)를 갖는다. 끝점이 아닌 대상 버퍼의 시작에 대한 포인터를 반환해야합니다.

3

위와 아래에서 문자열 리터럴에 대해 언급 한 것 외에도 문자열의 END에 대한 포인터를 반환하므로 세분화 오류가 발생하지 않는 경우에도 ""가 인쇄됩니다.