当结构作为双指针传递时访问结构变量

Access a struct variable when struct is passed as a double pointer

我有一个函数如下

int check_inband_status(Port **ePort, Port **wPort, InbandPort *inbandPort)
{

                std::ifstream ring_config_file(RING_CONFIG_FILE);

                Json::Value ring_config;
                ring_config_file >> ring_config;
                (*ePort)->port_id = ring_config["east_port"]["port_id"].asInt();
                (*ePort)->port_type = ring_config["east_port"]["port_type"].asString();
                (*wPort)->port_id = ring_config["west_port"]["port_id"].asInt();
                (*ePort)->port_type = ring_config["west_port"]["port_type"].asString();

                ring_config_file.close();
}

我有一个 json 文件,我正在阅读它并将值分配给 ePort 和 wPort。 这是变量 ePort 和 wPort

class InbandPort : public Port
{
    public:
        uint32_t                vid;
        uint32_t                nicid;
        uint32_t                intf_id;
        uint32_t                number_of_nni;
        bool                    is_lag;
        olt_intf_type_t         intftype;
        Port                    *port1;
        Port                    *port2;
        SubportList             sPorts;
        ERPSPort                *erpsPort;
        bool                    is_active;
        bool                    is_dhcp_done; /* to mark the dhcp is done or not is static dhcp case by default value                                                   is true*/
        bool                    is_ring_configured;
        InbandPort() : Port()
        {
            vid             = INVALID_ID;
            nicid           = INVALID_ID;
            intf_id         = INVALID_ID;
            port1           = NULL;
            port2           = NULL;
            erpsPort        = NULL;
            is_lag          = false;
            is_dhcp_done    = false;
            is_ring_configured = false;
            port_id         = 0;
            number_of_nni   = 0;
        }
.....

这是 json 文件

{
   "east_port" : {
      "port_id" : 2,
      "port_type" : "nni"
   },
   "west_port" : {
      "port_id" : 4,
      "port_type" : "nni"
   }
}

崩溃时间为

(*ePort)->port_id = ring_config["east_port"]["port_id"].asInt();

我知道我在 accessing/assigning 双指针中犯了一些错误。有人可以指点一下吗?

编辑:我将它作为双指针传递,因为我也想从其他函数访问相同的值。 我的路过是

Port                       *ePort  = NULL;
Port                       *wPort = NULL;
check_inband_status(&ePort, &wPort, inbandPort);

对我来说,它看起来像是用于设置或初始化函数的典型 C 接口。

使用双指针 (object_type**) 以便可以在堆上分配对象并将地址返回给函数的调用者。我担心,这就是你所缺少的。您尝试写入一个不存在的对象。

如果函数的调用者是良性的,他们会在将指针(或者更确切地说,它的地址)传递给函数之前初始化指向 nullptr 的指针,您可以验证它必须被创建第一的。但是由于 nullptr 初始化不是默认的,你不能指望它。

就在几天前,YouTube 上的 CppCon 频道发布了关于指针基础知识的去年活动的精彩演讲 (https://www.youtube.com/watch?v=0zd8eznWv4k)。

您正在传递空指针的地址,因此 *ePort*wPort 都是空指针。
然后你取消对它们的引用,它就开始繁荣了。

该函数可能应该(动态地)创建新对象并将它们的地址分配给 *ePort*wPort

创建什么类型的对象并不明显,但我希望它看起来像这样(但有一些错误处理):

int check_inband_status(Port **ePort, Port **wPort, InbandPort *inbandPort)
{
    std::ifstream ring_config_file(RING_CONFIG_FILE);
    Json::Value ring_config;
    ring_config_file >> ring_config;
    Port* east = new Port;
    east->port_id = ring_config["east_port"]["port_id"].asInt();
    east->port_type = ring_config["east_port"]["port_type"].asString();
    Port* west = new Port;
    west->port_id = ring_config["west_port"]["port_id"].asInt();
    west->port_type = ring_config["west_port"]["port_type"].asString();
    *ePort = east;
    *wPort = west;
    return something_meaningful;
}

另一种选择是,它不是应该动态创建对象而只是修改它们。
在这种情况下,您只需要一级指针(或引用):

int check_inband_status(Port *east, Port *west, InbandPort *inbandPort)
{
    std::ifstream ring_config_file(RING_CONFIG_FILE);
    Json::Value ring_config;
    ring_config_file >> ring_config;
    east->port_id = ring_config["east_port"]["port_id"].asInt();
    east->port_type = ring_config["east_port"]["port_type"].asString();
    west->port_id = ring_config["west_port"]["port_id"].asInt();
    west->port_type = ring_config["west_port"]["port_type"].asString();
    return something_meaningful;
}

// ...

Port ePort;
Port wPort;
check_inband_status(&ePort, &wPort, inbandPort);