2013-07-02 3 views
0
int main(void){ 
    char * strPtr="Hello World"; 
    printf("\n%s", strPtr);  
    *(strPtr+2)='Z'; 
    printf("\n%s", strPtr);  
    getch(); 
} 

나는 오류를 제공하지 않습니다배열의 두 번째 요소를 변경할 수없는 이유는 무엇입니까?

*(strPtr+2)='Z'; 

컴파일러에 의해 char 배열의 두번째 요소를 변경하고자하지만 난 실행할 때, 코드는 컴퓨터에 달려 있습니다. 어디서 실수입니까?

답변

6

대신 문자 포인터, 실제 배열을 사용하도록 코드를 변환 :

int main(void){ 
    char strPtr[] = "Hello World"; 
    printf("\n%s", strPtr);  
    *(strPtr+2)='Z'; 
    printf("\n%s", strPtr);  
    getch(); 
} 

그리고 너 괜찮을거야. 코드 에서처럼 초기화 된 문자 포인터를 사용할 때 문자열 데이터는 "읽기 전용"이므로 자주 수정할 수 없습니다. 다른 배열과 마찬가지로 실제 배열을 사용하면 더 이상 사실이 아닙니다. strPtr 이후 물론

는 이제 배열, 이름이 변경되어야하며 변경은 더 나은과 같이, 일반 색인을 사용하여 작성 :

strPtr[2] = 'Z'; 
13

당신이 실제로 그래서 당신은 수정할 수 없습니다 const char *

char * strPtr="Hello World"; 

뭔가를 선언 할 때 때문입니다.

에 "Hello World"로, 당신은

char * strPtr= strdup("Hello World"); //free it after 

또는

char strPtr[30] = {0}; 
strncpy(strPtr, "Hello World", 11); 

에 코드를 변경하고 코드가 메모리 주소를 staic하는

+0

그것은 심지어와 그러나 좋네요 - 일부 컴파일러는 암시 적 const 선언을 경고 플래그로 표시 할 필요가 없음을 알지 못합니다. – LostBoy

+0

플래그가없는 경우에도 g ++을 사용하면 경고 메시지가 나타납니다. – Alexis

+0

GCC 4.4.5에서이 문제점을 기쁘게 무시합니다. - 벽 ...따라서 "some compilers";) – LostBoy

2

StrPtr 함수는 점을 작동 될 것이다의 일부입니다 귀하의 바이너리. 허용 할 수없는 "Hello World"문자열의 변경을 시도하고 있습니다.

당신은 strPtrconst char *이기 때문이다

char strPtr[30] = {0}; 
memcpy (str, "hello World",11); 
*(strPtr+2)='Z'; 
2

을 할 수 있습니다. 이 배열의 요소를 변경해야하는 경우는 다음과 같이, 힙에 할당해야합니다

int main(void){ 

    char * strPtr= malloc(sizeof("Hello World") + 1); 
    strncpy(strPtr, "Hello World", sizeof("Hello World") + 1); 
    printf("\n%s", strPtr);  
    *(strPtr+2)='Z'; 
    printf("\n%s", strPtr);  
    getch(); 
    free(strptr); // don't forget to free it ! 
} 
+0

'strdup()'이식성이 좋지 않습니다. 'getch()'함수가 MS 윈도우에 있다고 생각하게한다. :) – yeyo

+0

@ 키라오! 감사합니다 나는 내 대답을 편집했습니다 :) – nouney

+0

OOps 그것이 강렬했습니다. 대답을 주셔서 감사합니다 – Lyrk

1

당신이 가리키는 const 포인터를 선언하고 있기 때문에, 여기에 메모리가 아닌 힙에 할당됩니다. 알렉시스

에 의해 제안

char * strPtr="Hello World"; 
는 는

사용 malloc 또는 strdup 이것은 또한 작동합니다 : 당신이 그들을 수정할 수 있도록 메모리 힙에 할당해야

char strPtr[]= "Hello world"; 
+1

정말 메모리가 스택에 수정할 수 있습니다. –

+0

@Armin 예,하지만 동적 변수는 힙에 할당됩니다. – dejavu

+0

답변에 동적 할당을 사용하는 변수가 표시되지 않습니다. –

관련 문제