2011-03-17 5 views
5

"메모리 액세스 위반"이라고하는 이유는 무엇입니까?char * 수정할 수 없습니다 - 메모리 액세스 위반

char* str = "HelloGuys"; 
    int len = strlen(str); 
    for (int i=0; i<(len/2); ++i){ 
     char t = str[len-i-1]; 
     str[len-i-1] = str[i]; //error 
     str[i] = t; 
    } 
+7

언어는이다 이 점에서 바보 :'const char []'에서'char *'로의 잘못된 변환을 허용한다. 즉, 암시 적으로'const'를 제거하여 수정 가능하다고 생각하도록 속이고 있습니다. 그렇지 않습니다. (이 변환은 C++ 0x에서 제거되었습니다.) – GManNickG

+1

@GMan : C와 C++ 문자열 리터럴 간에는 큰 차이가 없습니다. 모든 문자열 리터럴이 구분되는지 여부는 C++ 및 C에서 정의 된 구현은 지정되지 않습니다. 그러나이 질문에 관한 한 문자열 리터럴의 내용을 수정하려는 시도는 C++뿐만 아니라 C에서도 정의되지 않은 동작을 호출합니다. 위의 코드를 고려하면 차이는 무시할 수 있습니다. –

+0

@Prasoon : 기술적 인 이유가 왜 다른가요? (기술적으로 답은 틀린 추론을 가지고 있습니다.) 둘 다 "문자열 리터럴을 수정하지 않거나 정의되지 않은 동작을 얻지 못합니다"라고 말하면서 C++은 리터럴을 const로 만들어서 C가 " 문자열 리터럴 (char []'형식)을 수정하면 정의되지 않은 동작이 발생합니다. " 내 복귀는 총체적으로 이해하지 못할 수도 있습니다. 왜냐하면 이전에 저와 다른 엔지니어가 기술적 인 차이점에 대해 토론하고 두 태그 모두 모호하고 혼란스럽게 만들었 기 때문에 여기에 의견이 있었기 때문입니다. – GManNickG

답변

22

문자열 리터럴은 메모리의 읽기 전용 섹션에 저장됩니다. 문자열 리터럴의 내용을 수정하려는 시도는 정의되지 않은 동작 (대부분의 구현에서 세그먼트 화 오류)을 호출합니다.

가 Prasoon 이미 말했다 오히려

char str[] = "HelloGuys"; 
+0

은 여전히 ​​배열 내의 개별 문자를 수정할 수 없습니다 –

+0

문자열 리터럴 *은 메모리의 읽기 전용 섹션에 저장 될 수 있습니다 –

1

으로 문자의 배열을 사용하여 문자열 리터럴은 수정할 수 없습니다. 당신은 문자의 수정 배열을해야하는 경우

은 다음과 같이 그것을 가지고 :

char str[] = "HelloGuys"; 
0

는,이 문제를 해결 읽기 전용 메모리 포인터 대신 배열을 사용하려면 :

char str[] = "HelloGuys"; // change this line 
int len = strlen(str); 
for (int i=0; i<(len/2); ++i){ 
    char t = str[len-i-1]; 
    str[len-i-1] = str[i]; 
    str[i] = t; 
}