2017-11-08 14 views
1

아래 코드를 실행할 때 세그먼트 화 오류가 발생합니다. 이 오류의 원인은 무엇입니까? 제발 도와주세요char 포인터의 세그먼트 화 오류

int main() 
{ 
    char *str2 = "Hello"; 
    str2[3] = 'J'; 
    printf("%s\n",str2); 
    return 0; 
} 
+4

문자열 상수는 불변 시도를'숯불과 str2 [] =."안녕하세요 ";?' –

답변

7

string literal의 내용을 수정하려고하므로 정의되지 않은 동작은 입니다. 에 저장된 문자열 리터럴은 읽기 전용 위치입니다. 그래서 그것을 수정하지 않으면 정의되지 않은 동작이 호출됩니다.

C11 §6.4.5 문자열 리터럴 (단락 7)

는 이러한 어레이가 요소가 적절한 값을 제공하는지 구별 불특정이다. 에 프로그램 시도, 행동은 정의되지 않는다 어느 형태의 문자열 리터럴 수정하는 경우 "

+1

'문자열 리터럴이 읽기 전용 위치에 저장되었습니다. '. 음, 필수 사항은 아니며, UB 만 수정하면됩니다. –

3

문자열 상수를 수정할 수 없으며,이 경우 런타임 오류가 발생합니다. 당신은 str2의 선언을 변경하여 문제를 해결할 수 있습니다

char str2[] = "Hello"; 

이 그것을 배열이 아닌 상수 문자열에 대한 포인터를 만든다.

2

char*이 가리키는 메모리를 문자열 리터럴로 초기화 된 변수로 수정할 수 없습니다. 읽기 전용입니다.

+0

이 표현하는 것은, –

+0

''char * p = "test", p = "test again";와 같은 것을 쓰는 것은 매우 합리적입니다, –

+0

편집했습니다. 그 말이 맞습니다. 포인터를 다시 할당 할 수는 있지만, 메모리를 가리키고 있습니다. ~ 문자열 리터럴을 할당 한 후는 읽기 전용 – Matt