将数字传递给成员函数会导致程序崩溃

Posted

技术标签:

【中文标题】将数字传递给成员函数会导致程序崩溃【英文标题】:Passing a number into member function causes program crash 【发布时间】:2015-08-12 20:52:39 【问题描述】:

我刚开始学习指针以及它们如何作为成员函数工作。我开始玩了一下,最终写了一小段代码:

class Animal

private:
    int *itsAge = 0;
    int *itsWeight = 0;

public:
    void SetAge(int age)  *itsAge = age; ;
    int GetAge()  return *itsAge; ;
;



int main() 

    Animal Lion;
    Lion.SetAge(3);
    cout << Lion.GetAge();

    return 0;

;

我的问题是为什么我的程序在运行时会崩溃?在我看来,我将数字 3 按值传递给 SetAge() 函数。然后,值 3 的副本存储在 age 中,然后将其分配给指针 itsAge 的值。是因为 itsAge 从未分配过地址吗?如果是这样,这是否意味着将 itsAge 初始化为 0,并没有真正准备好要使用的指针?

【问题讨论】:

为什么将itsAgeitsWeight 声明为指针? 我建议放弃类和成员函数,先了解指针的工作原理。 【参考方案1】:

将你的程序改写为:

struct Animal 
    int age = 0;
    int weight = 0;
;

int main() 
    Animal lion;
    lion.age = 3;
    std::cout << lion.age;
    return 0;
;

不需要指针。仅供参考,您的程序正在崩溃,因为您正在初始化指向 0 的指针,然后使用 * 取消对它们的引用,这是 Undefined Bevahiour。

【讨论】:

哦,好吧。是的,我知道一般指针作为成员变量是不必要的。我只是好奇为什么我的程序崩溃了。感谢您的洞察力! 哦,快速提问。它是否会导致未定义的行为,因为编译器会先读取 *itsAge,然后再将 age 的值分配给它?只是好奇编译器为了完成赋值操作而经历的操作顺序。 @Jason 在int *itsAge = 0; 中,您正在初始化一个指向地址0指针,该地址通常是保留的。这意味着当您执行*itsAge 时,您是在告诉您的程序查看地址为0 的内存块,这会触发操作系统错误。 哦,好吧,从来没有意识到 0 代表一个地址。非常感谢!

以上是关于将数字传递给成员函数会导致程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

C ++:将对象按值传递给同一类的成员函数

我应该如何将指向成员函数的指针传递给 OpenCV 中的 setMouseCallback?

将指向 int 数组的指针传递给成员函数,错误:数组下标的无效类型“int [int]”

在 gcc 上将成员函数指针传递给模板成员函数时出现问题

Python: 通过引用将类成员项传递给它的一个成员函数。

将 C++ 成员函数指针传递给 STL 算法