2013-05-22 2 views
4

어제 나는 수제 "strcpy"기능에 약간 문제가있었습니다. 그래도 작동하지만 조금 혼란 스러워요!배열과 포인터의 차이

char* a = "Hello, World!"; //Works 
char b[] = "Hello, World!"; //Works also 

strcpy(a, "Hello!"); //Segmentation fault 
strcpy(b, "Haha!!"); //Works.. 

차이점은 무엇입니까? 왜 char 포인터는 "Segmentation fault"를 야기합니까?

왜 이런 식으로 작동합니까? :

char* a = "Haha"; //works 
a = "LOL"; //works.. 
+0

이것은 C 부분 집합에 관한 것이기 때문에 C++ 태그를 제거했습니다 (심지어 거기서도'strcpy'를 직접 구현하지 않을 것입니다). –

+0

C FAQ의이 섹션을 읽으십시오 : http : //c-faq.com/aryptr/aryptr2.html – Claudio

+0

@honk 예, 의미가 있습니다 –

답변

14
char* a = "Hello, World!"; 

당신에게 리터럴 문자열에 대한 포인터를 제공합니다. 문자열 리터럴은 읽기 전용 메모리에 있으므로 내용을 변경할 수 없습니다.

char* a = "Haha"; //works 
a = "LOL"; //works.. 

리터럴 다른 문자열을 가리 키도록 포인터 a을 변경합니다. 문자열 리터럴의 내용을 수정하지 않으므로 안전하고 정확합니다.

char b[] = "Hello, World!" 

은 스택에 배열을 선언하고 문자열 리터럴의 내용으로 초기화합니다. 스택 메모리는 쓰기 가능하므로이 메모리의 내용을 완벽하게 변경하는 것이 안전합니다.

+0

그래서 난 숯불 포인터, 바로 하나의 문자를 수정할 수 없습니까? –

+2

@NormalPeopleScareMe 맞습니다. 그것은 문자열 * 상수 *를 가리키고 있습니다. –

+4

글쎄, 정의되지 않은 동작이므로 제대로 동작하지 않을 수도 있습니다. 나의 충고는 항상 그렇지 않다고 가정하는 것이다. –

1

첫 번째 예에서, a가 가리키는 읽기 전용 메모리에 쓰려고하기 때문에 세분화 오류가 발생합니다. 포인터를 사용하려면 힙에 메모리를 할당하고 사용 후 삭제하십시오 . 여기서 b는 "Hello, World!"로 초기화 된 문자 배열입니다.

두 번째 예에서는 다른 문자열 리터럴을 가리키는 포인터를 만들고 있습니다.

+0

이 답변은 매우 유용합니다. 문자열 리터럴이 읽기 전용 메모리에 있다는 것을 몰랐습니다. 또한 튜토리얼에서 strcpy와 조합하여 char 포인터를 사용하는 방법을 발견했습니다. 여기서는 세그멘테이션 오류가 발생했으며 메모리를 할당했기 때문에 왜 그들이 그것을했는지 되돌릴 수 없었습니다. 감사. –