变量始终为空

Variable always empty

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

file.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_fifo\n");

    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 已正确添加到 bashrc,并且可以正常工作,但是,当我启动该程序时,这是输出:

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 是全球性的无关。我将定义放在 main 中,当我尝试打印 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]结束,临时对象被析构时,这个指针就会失效。

也为write_path使用一个std::string对象,在main函数中定义它,当你需要一个null时使用字符串的c_str函数-终止字符串。

write_path 被初始化为指向temporary 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-style string literal has static storage duration 并在程序的生命周期内存在于内存中,然后 write_path 始终是一个有效的指针。