下面的代码运行正常,但如果我尝试访问函数m_sal
中的私有成员变量fun()
,则会导致分段错误。
任何人都可以解释原因吗?
class Emp
{
int m_sal;
public :
void fun(char* name)
{
std::cout<<"Name :"<<name<<std::endl;
}
};
int main()
{
Emp *e = NULL;
e->fun("Hi");
return 0;
}
答案 0 :(得分:1)
通过NULL指针调用方法 - 正如您所做的那样 - 是未定义的行为。所以它可能崩溃,而不是崩溃,做任何事情。
答案 1 :(得分:0)
首先,您可能希望将方法的签名更改为
void fun (const char* name) const;
不推荐将"Hi"
转换为char *且const正确性为highly recommended。您的崩溃是由人们通过在空指针上调用您的方法提到的。尝试
Emp * e = new Emp;
e->fun("Hi");
代替。
答案 2 :(得分:0)
当然它崩溃了。
Emp *e = NULL;
创建一个恰好是空指针的指针(由于= NULL
,但我相信我们中的许多人更喜欢= nullptr
),因此没有为它指向的对象分配内存至。您需要创建一个指针指向的对象:
Emp* e = new Emp;
现在你可以使用它。
崩溃的确切原因是应用程序试图从非常低的内存地址获取值(指针的值为0,在某些情况下,可能为C ++对象的正确内存布局添加一些填充字节,但在这种情况下,它很可能只想读取地址为0的内存,在大多数情况下,系统会保留OS以供系统使用。
答案 3 :(得分:0)
在您的代码中,e
是一个指针,而不是一个对象的实际实例。你可以有:
Emp e;
e.fun("Hi");
//No need to clean up stack variable
OR
Emp *e = new Emp;
e->fun("Hi");
delete e; //don't forget to clean up!
由于使用空指针调用函数,所以你所拥有的是未定义的行为。