2011-04-30 6 views
0

가능한 중복 :
why segmentation fault in this program이 경우 세그먼트 화 오류가 발생하는 이유는 무엇입니까?

int main() 
{ 
     char *a="asdasd"; 
     int i; 

     for(i=0;i<6;i++) 
     { 
       (*a)++; 
       printf("\n%s",a); 

     } 
} 

출력 분할 오류

int main() 
{ 
     char a[]="asdasd"; 
     int i; 

     for(i=0;i<6;i++) 
     { 
       (*a)++; 
       printf("\n%s",a); 

     } 
} 

없음 세그먼트 오류

+1

운이 좋았 기 때문에 첫 번째 프로그램에서 세그먼트가 잘못되었습니다. 당신이 불행했기 때문에 두 번째 프로그램에서 세그멘테이션 오류가 없습니다. 스코프 내에 프로토 타입이없는'printf()'(또는 변수의 수를 허용하는 함수)를 호출하면 정의되지 않은 동작이 호출됩니다. 정의되지 않은 행동의 표현 중 하나는 세분화 오류 (좋은 징후)입니다. 다른 것은 여러분이 기대하는대로 작동합니다 (나쁜 표현) ... 아, 그리고 첫 번째 프로그램에서도 수정할 수없는 배열을 변경하려고합니다 : 정의되지 않은 동작의 또 다른 경우 – pmg

+0

@pmg 증상에 대한 링크를 제공 할 수 있습니까? 정의되지 않은 행동? – bacchus

+0

@bacchus : http://c2.com/cgi/wiki?UndefinedBehavior – pmg

답변

1

에서 첫 번째 것은 char 포인터를 선언하고 상수 char에 대한 포인터의 값을 할당하는 것입니다. 두 번째 것은 char의 배열을 선언하고 초기 값을 지정하지만 종료합니다 최대 상수가 아닙니다. 루프에서 포인터의 위치 또는 배열의 첫 번째 인덱스에서 값을 증가시킵니다. 포인터가 상수 char을 가리키므로 실패합니다. 상수는 변경할 수 없습니다. 그러나 배열은 수정할 수 있으므로 실패하지는 않습니다.

+0

답안에서 알 수 있듯이 C 문자열 리터럴 ('char []'유형)은'char *'로 부패합니다.'const char *'가 아닙니다. 포인터 ('const char * a = "foo";')에'const'를 추가하는 것은 좋은 생각 인 것 같습니다. 그러나 이것은 문제와 관련이 없습니다. – pmg

+0

그러나 문자열 리터럴이 '상수'라는 점은 icktoofay의 요점이 아닙니다. (즉, 수정 불가능) - 키워드 'const'가 아닙니다. –

+0

@pmg : 죄송합니다. 배열을 수정할 수 있다고 말하려고했지만'char * '로 정의되었지만'const char *'값으로 할당 된 배열은 수정할 수 없습니다. 아마 나는 내가 할 수 있었던 것처럼 분명하지 않았다. – icktoofay

0

아키텍처하면 읽기 전용 정말 당신이 그렇지 않으면 말했다 비록 const char*입니다 때문에 표시되는 페이지에서 상수 문자열 "asdasd"를 저장하여 char *a="asdasd"; 구현을 사용하고 있습니다. 이는 운영 체제가 코드와 같이 여러 프로세스에서 이러한 페이지를보다 쉽게 ​​공유 할 수있게 해주므로 좋은 방법입니다. 당신은 GCC를 사용하는 경우이 작업을 수행 할 때 당신이 older version (이전 4.0)를 사용하는 경우, 또는 -fwritable-strings (또는 -traditional)는 읽기를 사용하지 않도록 경고

당신은 컴파일러를 가지고 -Wwrite-strings을 사용할 수 있습니다 페이지 맵핑 만.

+0

Hmm .. C에서 문자열 리터럴은'const char []'나'const char *'가 아니라'char []'입니다.'gcc -Wwrite-strings'를 사용하면 gcc가 C와 비슷한 언어에 대한 컴파일러 구현이되지만, C가 아닙니다. – pmg

+0

@pmg 문자열 리터럴은 정식 유형'char []'을 갖지만 의미 유형'const char []'을 갖습니다. C++은 마지막 반복과 함께 그것을 변경하고, C 컴파일러는 따라야합니다. – geocar

관련 문제