class Base {
protected:
string m_strName;
char* pchChar;
public:
Base()
{
m_strName = "Base";
pchChar = NULL;
};
void display()
{
printf(" display name : %s %c\n",m_strName.c_str(),pchChar);
};
};
class Derived : protected Base {
public:
Derived()
{
init();
};
void init()
{
m_strName = "Derived";
pchChar = (char*)malloc(sizeof(char));
strcpy(pchChar,"A");
printf(" char %c\n",*pchChar);
display();
};
};
int main()
{
Derived* pDerived = new Derived();
return 0;
}
观察到的输出是
char A
display name : Derived P
虽然我预计pchChar在两种情况下都应该具有值“A”。 我错过了任何一条信息吗? 请建议。
答案 0 :(得分:2)
您忘记了*
:
printf(" display name : %s %c\n",m_strName.c_str(), *pchChar);
应该是*pchChar
,而不是pchChar
。因为您将其打印为%c
。
或者您可以使用%s
作为格式字符串,如果c-string是以空字符结尾的字符串,则printf将起作用。目前它不是以空值终止的。你应该这样做:
pchChar = (char*)malloc( 2 * sizeof(char)); //2 chars, one for `\0`
strcpy(pchChar,"A");
甚至更好地使用new
和std::cout
。
另外,一旦完成内存,请不要忘记用free
调用malloc
来取消分配内存。如果您使用new
,请使用delete
。
答案 1 :(得分:2)
printf(" display name : %s %c\n",m_strName.c_str(),pchChar);
应该是:
printf(" display name : %s %c\n",m_strName.c_str(),*pchChar);
第一个将指针强制转换为一个字符,因此完全取决于该字符位于地址空间中的 where 。
第二个将正确地取消引用指向获取角色的指针,就像你在派生类的init
代码中所做的一样。
这个小片段:
pchChar = (char*)malloc(sizeof(char));
不为"A"
字符串分配足够的空间,您需要两个字符:
pchChar = (char*)malloc(2); // sizeof(char) is ALWAYS 1 !!!
或者更好的是,根本不要使用malloc
。尽管C ++为C兼容性提供了这些功能,但您最好使用new
和delete
。