如何初始化类中的char指针?

Jat*_*tin 1 c++

在处理char指针时我感到困惑.请看下面的代码:

class Person
{
    char* pname;
public:
    Person(char* name)
    {
        //I want to initialize 'pname' with the person's name. So, I am trying to
        //achieve the same with different scenario's

        //Case I:   
        strcpy(pname, name); // As expected, system crash.

        //Case II: 
        // suppose the input is "ABCD",  so trying to create 4+1 char space
        // 1st 4 for holding ABCD and 1 for '\0'.
        pname = (char*) malloc(sizeof(char) * (strlen(name)+1) );
        strcpy(pname, name);

        // Case III: 
        pname = (char*) malloc(sizeof(char));
        strcpy(pname, name);
    }

    void display()
    {
        cout<<pname<<endl;
    }
};

void main()
{
    Person obj("ABCD");
    obj.display(); 
}
Run Code Online (Sandbox Code Playgroud)

对于案例I:正如预期的那样,系统崩溃.

案例II的输出:

A B C D

案例III的输出:

A B C D

所以,我不确定为什么Case II和III会产生相同的输出!!!! .....我应该如何在类中初始化一个char指针?

Alo*_*ave 10

第三种情况调用Undefined Behavior,因此在这种情况下可能发生任何事情.
在这种情况下,您正在写超出已分配内存的范围,这可能会或可能不会崩溃但是是UB.

如何在C++中以正确的方式做到这一点?
完全不使用char *!
只需使用std :: string即可.

注意,它std::string为您提供了c_str()函数,它可以获取基础字符串.除非,你对将a的所有权传递char *给c风格的api 感到困扰,你应该总是std::string在c ++中使用.


Eri*_*c Z 5

第三个选项也是错误的,因为你没有为它分配足够的内存.您正在尝试将大小为5的字符串复制到大小为1的缓冲区,这意味着之后的数据pname[1]被错误地覆盖并消失了.

如果你很幸运,你可能会看到一个运行时错误,例如内存访问冲突,或者你看不到任何东西,但它背后的数据已经损坏,例如你的银行帐户,你直到...之后才知道它.

正确的方法是始终分配足够的内存来复制到.std::string正如Als所指出的,在C++中使用更好的方法就是使用它,因为它可以让你免于手动管理内存(分配,增长,释放等).

例如,

class Person
{
    std::string pname;
public:
    Person(char* name)
    {
        pname = name;
    }

    void display()
    {
        cout << pname << endl;
    }
};

void main()
{
    Person obj("ABCD");
    obj.display(); 
}
Run Code Online (Sandbox Code Playgroud)