在处理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 ++中使用.
第三个选项也是错误的,因为你没有为它分配足够的内存.您正在尝试将大小为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)
| 归档时间: |
|
| 查看次数: |
6415 次 |
| 最近记录: |