2013-10-18 3 views
0

C++에서 char * 배열을 사용하여 샘플 프로그램을 시도했지만 프로그램의 출력이 나에게 명확하지 않습니다.char 포인터 배열 출력 차이점입니다. C++

샘플 코드

#include<iostream> 
#include<stdio.h> 
#include<string.h> 
#include<string> 

using namespace std; 

int main() 
{ 
    string val="val1"; 
    char* hello[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; 

    hello[1]=(char*)val.c_str(); 

    val="val2"; 

    printf("The val in hello[1] is :%s\n",hello[1]); 

    hello[3]=(char*)val.c_str(); 

    printf("The val in hello[3] is :%s\n",hello[3]); 
} 

결과 : 내가 문자열

val.append("val2"); //val="val2"; 
를 추가했다

The val in hello[1] is :val2 

The val in hello[3] is :val2 

그러나 같은 프로그램

결과는

The val in hello[1] is :val1 

The val in hello[3] is :val1val2 
,536,

친절하게 설명하면 출력 결과가 어떻게 다른지 알 수 있습니까?

+0

공지 사항을 도움이되기를 바랍니다 후 처음 NULL입니다. –

+0

추가 한 문자열이 이미 할당 된 문자열 뒤에 "추가"된다는 것을 알고 있습니까? 코멘트에서 그것은 보이지 않는 것 같습니다 ... – JoelWilson

+1

컴파일러가 캐스트가없는 할당을 허용하지 않는 이유가 있습니다. 그건 캐스트하지 말고,'const char *'를 저장하는 것을 의미합니다 (그리고 무효화되지 않도록주의하십시오). – chris

답변

1

string.c_str()string에 사용되는 내부 char* 버퍼를 반환합니다.

처음에 c_str()을 통해 내부 버퍼에 대한 포인터를 가져오고 hello[1]에 저장하면 버퍼에 "val1"이 포함됩니다. 다음 줄에서 문자열을 값 "val2"으로 덮어 씁니다. "val1""val2"의 길이가 같기 때문에 새 값은 원래 버퍼에 들어가므로 덮어 씁니다.

반대로 "val2"val을 붙이면 원래의 내부 버퍼가 결과를 보유하기에 너무 작아서 새 버퍼를 할당해야합니다. 따라서 hello[1]hello[3]은 두 개의 다른 char*을 가리키며 다른 값을가집니다.

당신은 당신의 프로그램의 마지막에 몇 줄을 추가하여 두 개의 프린터 같지 않은 것을 볼 수 있습니다

printf("Pointer in hello[1]: %p\n", hello[1]); 
printf("Pointer in hello[3]: %p\n", hello[3]); 

내가 가지고 테스트 실행에 대한 결과 :

Pointer in hello[1]: 0x10ca00a68 
Pointer in hello[3]: 0x10ca00a88 

append을 호출하면 문자열에 새로운 더 큰 버퍼를 할당해야했습니다. 그러나 hello[1]의 버퍼가 현재 값을 유지한다는 보장은 없습니다. 왜냐하면 string 구현은 문자열 메서드에 대한 다른 호출을 한 후에 (나중에 다른 문자열에서도) 버퍼를 다시 사용하기로 결정할 수 있기 때문입니다.

+0

답장을 보내 주셔서 감사합니다. 이제 명확 해졌습니다. – Duraisamy

0

모두 null로 char 형의 *의 배열이 빈 문자열로 C++로 처리됩니다 "현재 값의 끝에 추가 문자를 추가하여 문자열을 확장합니다." printf와 메모리에 대한 포인터를 받아 '인쇄'문자 하나 하나가 NULL 만날 때까지에 시작 : 어떤 일이

. 따라서 NULL은 문자열을 종료합니다.NULL 이후의 모든 항목은 절대로 고려되지 않습니다.

append()는이 경우 마지막 문자의 끝에 문자 배치를 시작합니다. 어느 "VAL1"

그것이 NULL`는`char` 값이 아닌 '것으로