我对memcpy从一个字符串到一个cstring以及C ++中的字符串结构(即以下代码)感到困惑:

#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)会发生?

最佳答案

你真幸运。默认情况下,它不会初始化为任何东西。但是,可以使用char* char1 = new char[6]()将其初始化为0。
由于计算机上sizeof(str)实例的大小为string,因此8返回8。它不取决于str的长度。
使用memcpy(char1, &str, 6)时,它将复制str的前6个字节,而不是其内容的前6个字节。

08-08 07:07