2013-06-28 9 views
3

++ 연산자를 사용하여 segfault를 얻는 이유를 설명하십시오. 명시 적으로 1을 더하는 것과 ++ 연산자를 사용하는 것의 차이점은 무엇입니까?++를 사용할 때 seg 오류가 발생하지만 '1 +'을 사용할 때 오류가 발생하는 이유는 무엇입니까?

using namespace std; 
#include <iostream> 

int main() { 

    char* p = (char*) "hello"; 

    cout << ++(*p) << endl; //segfault 
    cout << 1 + (*p) << endl; // prints 105 because 1 + 'h' = 105 

} 
+7

'++ (* p)'는 문자열 자체를 수정하려고 시도합니다. 리터럴 문자열이기 때문에 그렇게 할 수 없습니다. 'char *'(원래'const char *'에서)로 캐스팅하는 것은 처음부터 잘못되었습니다. – jogojapan

+0

전적으로 정확하다고 생각하지 않습니다. 그 사람의 대답을 읽은 후에는 실제로 ++ 연산자를 호출하기 전에 (* p)가 'h'문자를 반환하기 때문에 실제로 문자열 리터럴이 아닌 문자 리터럴을 수정하려고한다고 생각합니다. –

+1

코드에는 리터럴이 하나뿐입니다.''hello "'(1은 제외하고는 관계가 없지만) 문자열 리터럴입니다. '* p'는 그 문자 안에있는 문자 중 하나의 주소를 가리 킵니다. 주소가 가리키는 값을 수정하려고 시도합니다. 이 작업을 성공적으로 수행하려면 해당 문자를 수정해야하므로 코드에 정의 된 문자열 리터럴의 일부이므로 문자열 리터럴을 수정하는 데 성공했을 것입니다. – jogojapan

답변

8

상수를 증가시키기 때문에. 환언

char* p = (char*) "hello"; // p is a pointer to a constant string. 
cout << ++(*p) << endl;  // try to increment (*p), the constant 'h'. 
cout << 1 + (*p) << endl; // prints 105 because 1 + 'h' = 105 

++ 연산자 p가 가리키는 문자를 증가하려고 시도하고 는 새로운 원래 값을 대체. p이 상수 문자를 가리키기 때문에 불법입니다. 반면에 단순히 1을 추가해도 원래 문자는 업데이트되지 않습니다.

+0

굉장한 간결한 대답은 문제를 아주 잘 설명합니다. +1 –

+0

특히 프로그램이 os에 의해 시작되면 해당 문자열이 실행 파일에서 읽혀지고 읽기 전용 인 메모리 페이지에로드됩니다. – antiduh

+1

그래서 기본적으로 내가 말하는 것은 'h'= 'h'+ 1입니까? 나는 지금 지진이 느껴진다. ... 나는이 질문이 투표를하지 않았다는 것을 믿을 수 없다. 그러나 레코드의 경우 문자열 리터럴을 수정하려고하지 않았습니다. 그렇습니까? ++ 연산자가 호출되기 전에 (* p) 문자 'h'를 반환하기 때문에 문자 리터럴을 수정하려고했습니다. 내가 맞습니까? 아니면 ...? –

2

C 스타일 문자열 리터럴을 수정할 수 없습니다. 그것이 ++(*p)의 것입니다.

관련 문제