2013-10-30 8 views
0

값을 char 포인터로 복사 할 때이 문제가 있습니다. 나는C++ char 포인터 복사

char* data = "abcdef"; 
char* d; 

d[0] = data[0]; 
d[1] = data[1]; 
d[2] = data[2]; 
d[3] = data[3]; 
printf("%s ", d); 

이 출력은 abcd 하지만 루프 이와 마지막 블록을 교체하는 경우 기본적으로 해당 인이

for(int i = 0; i < 4; i++) { 
    d[i] = data[i]; 
} 

사람이 무엇을 설명해 주시겠습니까 아무것도를 출력하지 쓰는 경우 차이점은 무엇입니까?

+5

이'C++ '에 태그를 붙 였으므로'std :: string','std :: cout' 등을 살펴보기 시작할 수 있습니다. 그렇지 않으면이 코드는 매우'C'입니다. – crashmstr

답변

9

d에 메모리를 할당하지 않았으므로 두 프로그램 모두 undefined behaviour입니다. 그들은 당신이 설명하는 방식을 포함하여 그들이 원하는 어떤 방식 으로든 자유롭게 행동 할 수 있습니다.

이 문제를 해결하려면 다음

  1. d 메모리를 할당;
  2. NUL 터미네이터를 d으로 작성했는지 확인하십시오.

P. 문자열 리터럴을 const 변수로 지정하는 방법은 C++에서 더 이상 유효하지 않습니다. 용도 :

const char* data = "..."; 
^^^^^ 

P.P.S. 질문이 [c++]으로 태그되었으므로 원시 C 문자열 대신 std::string을 사용해야합니다.

+3

그리고 메모리가 할당되었다하더라도 거의 확실하게 printf() 호출에서 벗어난다. –

+0

@PaulGriffiths : 좋은 지적, 감사합니다! – NPE

+0

답변을 주셔서 감사합니다,하지만 나는 이것과 비슷한 예를 보았습니다. char * c = "문자열 하나"; c = "다른 문자열"; 그래서 그것은 이동 포인터를 사용하여 메모리를 할당한다고 생각했습니다. – patentul