2014-02-12 5 views
-1

나는 C에서 포인터와 함께 테스트를 만들고 있었다 변경 시도, 나는이 코드를 시도 할 때 :이 포인터 값

int main() 
{ 

    char * b = "abc"; 
    char * c = b; 

    *c = *(b+1); //problem 
    printf("%s",c); 
} 

를 내가 주석 라인의 실수를 가지고, 내가 인쇄에 specting 있었는지는 영국 BBC이었다 포인터 할당이 작동하지 않는 이유는 무엇입니까?

+4

문자열 리터럴을 수정하는 정의되지 않은 동작입니다. – hmjd

+0

@BlueMoon dup에 대한 허용 된 대답은 실제로 꽤 나쁘다. OP는 키스의 대답을 받아들이지 않았다. 당신은 찾으려면 아래로 스크롤해야한다. –

+0

@ShafikYaghmour 질문 *은 * dup이며 * 그 페이지에서 * 좋은, 정확한 답변입니다. 내가 닫을 것을 결정할 때 그것이 내가 관심을 갖는 전부이다. OP가 받아 들일 수있는 것은 I/누군가가 영향을 미칠 수있는 것이 아닙니다. –

답변

4

c이 문자열 리터럴을 가리키고 있으며 문자열 리터럴을 수정할 수 없으면 undefined behavior입니다.

이러한 배열은 그 요소가 적절한 값을 제공 별개의 여부를 지정되지 않은 :이 초안 C99 표준 섹션에 6.4.5문자열 리터럴 단락 말한다 (강조 광산)에 덮여있다. 프로그램이 이러한 배열을 수정하려고하면 동작은 undefined입니다.

따라서이 프로그램의 동작은 예측할 수 없습니다.

0

변수 bc은 모두 프로그램의 (읽기 전용) 코드 섹션에있는 동일한 문자열을 가리 킵니다.

런타임 중에 CPU가 *c = *(b+1)을 실행하면 잘못된 메모리 액세스가 수행됩니다.

당신은 기능 main에서 로컬 배열로이 문자열을 선언해야한다, 그래서 대신 스택에 위치합니다 :

char b[] = "abc";