2012-04-03 1 views
-1

strcpy에 대해 물어보고 싶습니다. 문제가 생겼어. 내가 거기에 내 코드에 아무 문제가 없다고 생각C - strcpy 포인터

char *string1 = "Sentence 1"; 
char *string2 = "A"; 

strcpy(string1, string2); 

: 여기 내 코드입니다. string1 및 string2의 첫 번째 문자 주소는 strcpy 함수로 전송됩니다. 이 코드에는 아무런 문제가 없어야합니다. 아무도 나를이 문제를 해결하거나 나를 설명하는 데 도움주세요 ..

감사합니다.

+2

문자열 리터럴을 변경할 수 없습니다. http://c-faq.com/strangeprob/strlitnomod.html – cnicutar

+0

문자열 리터럴 (사용자의 '1 문장'과 'A')은 수정할 수 없습니다 (정의되지 않은 동작) 문자 배열. 그러한 배열에 (안정적으로)'strcpy()'를 할 수 없습니다. – pmg

+0

char * string1을 사용하면 괜찮습니까? 만? 문자열 복사를 두 번 사용하겠습니까? – kapilddit

답변

2

포인터가 각각 쓸 수없는 메모리를 가리키는 문제가 있습니다. 컴파일러가 애플리케이션에 빌드하는 상수를 가리키고 있습니다.

쓰기 가능한 메모리 공간을 할당해야합니다 (예 : char string1[<size>];을 통한 스택 또는 char *string1 = malloc(<size>);을 통한 힙). 필요한 버퍼 공간으로 바꾸고 적어도 NULL 종료를 위해 여분의 바이트를 추가하십시오. malloc() 인 경우 나중에 free()을 입력해야합니다.

+0

감사합니다 !! 이것이 char string2 [50]가 작동하는 이유를 설명합니다. 나는 포인터에 초보자입니다, 그래서 조금 포인터를 사용하는 방법을 혼란. 다시 한번 감사드립니다. – lucifer

1

이렇게하면 정의되지 않은 동작이 발생합니다. 컴파일러는 히스토리 버크 (문자열 리터럴이 const이 아니기 때문에)를 허용 할 수 있지만 기본적으로 많은 플랫폼에서 단순히 수정할 수없는 데이터를 덮어 쓰려고합니다. 리눅스 매뉴얼 페이지에서

0

:

의 char * strcpy를 (문자 * 이명 령, CONST의 char *의 SRC); strcpy() 함수는 dest에 의해 에 지정된 버퍼에 종료 null 바이트 ('\ 0')를 포함하는 의 src가 가리키는 문자열을 복사합니다. 문자열은 겹치지 않을 수 있으며 대상 문자열 dest는 사본을 수신 할만큼 충분히 커야합니다.

할당 된 수정 가능한 메모리 대신 문자열 리터럴을 가리키고 있기 때문에 * dest 포인터에 문제가 있습니다. 문자열 1을 char string1[BUFFER_LENGTH];으로 정의하거나 동적으로 malloc()으로 할당하십시오.