2014-11-03 7 views
0

문자열에서 방어 적이기 및 C++에서 문자열 구조, 즉, 다음 코드 :나는 CString을에 문자열에서 방어 적이기에 의해 혼란 스러워요

#include<iostream> 
#include<cstring> 
#include<string> 
using namespace std; 

int main() 
{ 
    string str="hahah"; 
    cout<<"the length of the coverted c string is: "<<strlen(str.c_str())<<endl; // 5 

    char *char1=new char[6]; 
    memcpy(char1, str.c_str(), strlen(str.c_str())); 
    cout<<char1<<endl; 
    // (1) output is "hahah", why copying only 5 bytes also produce correct result? Why the last byte default to be \0? 

    cout<<sizeof(str)<<endl; // (2) why the size of str is8, rather than 6 
    memcpy(char1, &str, 6); 
    cout<<char1<<endl; // (3) output is strange. Why ? 

    return 0; 
} 

어느 한 나를 설명 할 수있는 이유 (1) , (2), (3)에 대한 의견은 어떻게됩니까?

+0

당신이 답을 체크 아웃해야합니다 : http://stackoverflow.com/a/5952598/4182012 –

답변

2
  1. 행운입니다. 기본적으로 아무 것도 초기화되지 않습니다. 그러나 char* char1 = new char[6]()을 사용하여 0으로 초기화 할 수 있습니다.

  2. sizeof(str)string 인스턴스의 크기가 컴퓨터에 8이므로 8을 반환합니다. 길이는 str에 달려 있지 않습니다.

  3. memcpy(char1, &str, 6)을 사용하면 내용의 처음 6 바이트가 아닌 str의 처음 6 바이트를 복사합니다.