2013-08-13 4 views
0
#include <stdio.h> 
#include <conio.h> 

void test(char *p) 
{ 
    p = p + 1; 
    *p = 'a'; 
} 

int main() 
{ 
    char *str = "Hello"; 
    test(str); 
    printf("%s", str); 
    getch(); 
    return 0; 
} 

이 코드를 실행할 때 세그먼트 화 오류가 발생합니까? 왜 이런 일이 일어나는가? const 이론은 나에게 명확하지 않다 ... 반면에 str을 char str로 선언하면, 그 일을한다. 둘 다 기본적으로 같은 것이 아닌가?char * str 대 char str [] : 분할 문제

+0

포인터가 배열이 아닙니다. – alk

답변

7

str 문자열 리터럴을 가리키고,이 라인에 기능 test에 리터럴 문자열을 수정하려고 :

*p = 'a'; 

그것은이다 undefined behavior을 문자열 리터럴을 수정하려고 할 수 있습니다.

char str[] = "Hello"; 

지금은 str을 수정 완벽하게 괜찮 : 다음과 같이 다른 방법으로는, 배열로 문자 문자열의 복사본을 만들 수 있습니다. draft C99 standard에서, 섹션 6.4.5 String literals 단락 6 아래 :

는 이러한 배열은 자신의 요소가 적절한 값을 제공 별개의 여부를 지정합니다. 프로그램에서 이러한 배열을 수정하려고하면 동작이 으로 정의되지 않습니다.

5
*p = 'a'; 

문제는 위의 진술은 읽기 전용 세그먼트를 수정하려고합니다. 문자열 리터럴 "Hello"은 읽기 전용 세그먼트에 있으므로 수정할 수 없습니다. Hellostr 문자 배열과 배열 내용

char str[] = "Hello"; 

상기 문 사본이 수정 될 수있다.

관련 문제