当结构作为双指针传递时访问结构变量
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);
我有一个函数如下
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);