2013-08-22 3 views
0
int main() 
{ 
     char *s="Hello"; 
     *s="World"; 
     printf("%s\n",s); 
} 

왜 위 프로그램의 결과 세그먼트 화 오류가 발생합니까? *s 때문에세그먼트 화 오류가 c의 포인터와 관련 있음

+0

내 컴퓨터에서 컴파일도하지 않는다. –

+0

GCC에있는 경우 경고 플래그를 사용하여 컴파일 (예 : -Wall) 해보십시오. 그것은 당신에게 단서를 줄 것입니다. –

+0

문자열 리터럴을 덮어 쓰려고하는 것 외에도 variadic 선언없이 variadic 함수를 호출하는 것은 오류입니다. – jxh

답변

4
int main() 
{ 
    char *s="Hello"; // makes 's' point to a constant 
    *s="World";  // modifies what 's' points to 
    printf("%s\n",s); 
} 

코드의 첫 번째 라인은 상수 s 점을 만든다. 두 번째 줄은 s이 가리키는 것을 수정하려고 시도합니다. 그래서 여러분은 상수를 수정하려고합니다. 상수는 ... 음 ... 상수이기 때문에 할 수 없습니다.

2

char 아닌 char* (문자열)

+0

이것은 매달려 포인터와 관련이 있습니까 ?? – user2076561

2
char *s="Hello"; 

"Hello" 리터럴 문자열에 대한 포인터를 선언합니다. 읽기 전용 메모리에있을 수 있으므로 라인은

*s="World"; 

이며 결과는 정의되지 않은 동작입니다. 크래시는 정의되지 않은 동작의 유효한 (유용한) 형식입니다. 만들 때 다음과 같은 대안

하나는 정적 (전역) 메모리에

const char* s = "Hello"; 
s="World"; 
printf("%s\n",s); 

char s[16] = "Hello"; 
strcpy(s, "World";) 
printf("%s\n",s); 
+0

'* s'는 문자열이 아니라'char'입니까? – verbose

+1

컴파일시 경고/오류가 발생할 수 있습니다. 런타임시 Segfault는's'에 의해 읽기 전용 위치 포인터에 쓰려고 시도 (다른 문자열 리터럴의 주소)를 시도 할 것입니다. – simonc

1

s 점을 작동합니다. 런타임에는 메모리에 다시 할당 할 수 없으므로 충돌이 발생합니다.

+0

메모리에 대해 더 자세히 설명 할 수 있습니까? – user2076561

+0

컴파일러는이 유형의 정적으로 할당 된 문자열에 대한 특수 메모리 위치를 따로 설정합니다. '* s = "다른 문자열"을 호출하면 읽기 전용 일 가능성이있는 해당 메모리에 액세스하려고합니다. 이 경우 동작은 정의되지 않습니다. – edtheprogrammerguy

+0

@edtheprogrammerguy 우리는 재 지정할 수는 있지만 다시 쓸 수는 없습니다. – sujin

1

*s이 문자열의 첫 번째 문자이므로 문자를 문자열에 할당하면 오류가 발생합니다.

당신이 문자열이 작동하려고 지금 s = "world"

int main() 
{ 
    char *s="Hello"; 
    s="World"; 
    printf("%s\n",s); 
} 

를 사용 assing로합니다.

char *s="hello"; 여기서 s은 읽기 전용 위치에 있습니다. 그래서 우리는 다른 문자열을 지정할 수는 있지만 새로운 문자열을 다시 쓸 수는 없습니다.

s = "hello"; //work 
strcpy(s, "hello"); //segmentation fault 
1

여기에는 두 가지 문제가 있습니다. 당신에게 문자열 "Hello", 또는 'H'의 첫 번째 문자를 제공

*s = "World"; 

역 참조s. 따라서 하나의 char 개체 ("Hello" 문자열 리터럴의 첫 번째 문자)에 포인터 값 (문자열 "World"의 주소)을 할당하려고합니다. (네, 분명히이 같은), 문자열 리터럴은 읽기 전용 데이터 세그먼트에 저장되며, 읽기 전용 메모리를 수정하려고 시도하는 것은에서 런타임 오류로 이어질 것입니다 일부 시스템

하지만 ...

일부 시스템. 그러므로 충돌.

는 단순히 역 참조를 삭제, 문자 그대로의 "세계"문자열로 s에를 변경하려면 :

s = "World"; 
1

* s는 S와 동일하다 [0]. s [0]에는 단일 문자를 저장할 공간이 있습니다. 이 경우 'W'.

"세계"의 위치를 ​​저장할 수있는 공간이 없습니다.

그래서 세분화 오류가 발생합니다.

관련 문제