访问私有成员导致segfault

Accessing private member leading to seg fault

本文关键字:segfault 成员 访问      更新时间:2023-10-16

下面的代码工作得很好,但是如果我试图访问函数fun()中的私有成员变量m_sal,它会导致分段错误。

有谁能解释一下原因吗?

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;
}

通过NULL指针调用方法-正如您正在做的那样-是未定义的行为。所以它可能会崩溃,而不是崩溃,做任何事情

首先可能需要更改方法的签名为read

void fun (const char* name) const;

不赞成从"Hi"转换为char *,强烈建议使用const正确性。正如人们提到的那样,你的崩溃是由在空指针上调用你的方法引起的。试着

Emp * e = new Emp;
e->fun("Hi");

当然会崩溃

Emp *e = NULL;

创建了一个指针,它恰好是一个空指针(因为= NULL,但我确信我们中的许多人更喜欢= nullptr),所以没有为它所指向的对象分配内存。您需要创建一个该指针将指向的对象:

Emp* e = new Emp;

现在你可以使用它了

崩溃的确切原因是应用程序试图从一个非常低的内存地址(指针的值为0,在某些情况下添加一些填充字节可能是为了正确的内存布局的c++对象,但在这种情况下,它很可能只是想读取地址0的内存),在大多数情况下和操作系统是保留给系统使用的

在您的代码中,e是一个指针,而不是对象的实际实例。你可以有:

Emp e;
e.fun("Hi");
//No need to clean up stack variable

Emp *e = new Emp;
e->fun("Hi");
delete e;   //don't forget to clean up!

你所拥有的是未定义的行为,因为使用空指针来调用函数