变量始终为空

Variable always empty

本文关键字:变量      更新时间:2023-10-16

我在初始化全局变量时遇到问题。我的C++有点生疏,所以我不记得我的代码不起作用的原因。

文件.cpp

const char * write_path = &(std::string(getenv("FIFO_PATH")) + "/pythonread_fifo")[0];
int main(int argc, char**argv)
{
std::cout << "printing a string: ";
std::cout << (std::string(getenv("FIFO_PATH")) + "/pythonread_fifon");
std::cout << "printing a const char*: ";
std::cout << &(std::string(getenv("FIFO_PATH")) + "/pythonread_fifo")[0] << std::endl;
std::cout << "printing write_path:";
std::cout << write_path;
std::cout << write_path << std::endl;
std::cout << "printing FIFO_PATH:" << std::string(getenv("FIFO_PATH"));
}

作为前提:FIFO_PATH已被正确添加到 bahrc 中,并且可以工作,但是,当我启动该程序时,这是输出:

printing a string: /home/Processes/FIFOs/pythonread_fifo
printing a const char*: /home/Processes/FIFOs/pythonread_fifo
printing write_path:
printing FIFO_PATH:/home/Processes/FIFOs

如您所见write_path完全是空的。

更让我奇怪的是,如果我write_path定义为:

const char * write_path = "/home/Processes/FIFOs/pythonread_fifo";

然后write_path不再为空,它被正确初始化和打印。

我该如何解决这个问题?或者至少,为什么会这样?

编辑:该问题与write_path是全球性的无关。我将定义放在主write_path,当我尝试打印时,它仍然是空的

write_path

被初始化为指向临时std::string的第一个元素的指针,该元素将在完整表达式后立即被销毁,左write_path悬垂,取消引用会导致 UB。

可以直接使用std::string,也可以使用命名std::string,然后从中获取指针。

std::string s = std::string(getenv("FIFO_PATH")) + "/pythonread_fifo";
const char * write_path = &s[0]; // or s.c_str()

另一方面

const char * write_path = "/home/mverrocc/dss_cp/dss-cp/Processes/FIFOs/pythonread_fifo";

工作正常,C 样式字符串文本具有静态存储持续时间,并且在程序的生命周期内存中存在,则write_path始终是有效的指针。

const char * write_path = &(std::string(getenv("FIFO_PATH")) + "/pythonread_fifo")[0];

构造一个临时std::string,获取其第一个字符的地址,然后丢弃字符串,从而删除底层的char数组。这是 UB。

最好只使用std::string,并在需要const char*时使用c_str()

您正在创建一个临时std::string对象,并获取指向其第一个字符的指针。当表达式&(std::string(getenv("FIFO_PATH")) + "/pythonread_fifo")[0]结束时,当临时对象被破坏时,此指针将变为无效。

也使用std::string对象进行write_path,在main函数中定义它,并在需要以 null 结尾的字符串时使用字符串的c_str函数。