Search code examples
c++initializationgloballifetimetemporary

Variable always empty


I'm having troubles initializing a global variable. My C++ is a bit rusty so I can't remember the reason why my code isn't working.

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"));
}

As a premise: FIFO_PATH has been correctly added to bashrc, and it works, however, when I launch this program this is the output:

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

As you can see write_path is completely empty.

What's even stranger to me is that if I define write_path as:

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

Then write_path is no longer empty, it's correctly initialized and printed.

How can I solve this? Or at the very least, why is this happening?

EDIT: The issue IS NOT related to write_path being global. I placed the definition inside the main and when I try to print write_path, it's still empty


Solution

  • write_path is initialized as a pointer pointing to the 1st element of a temporary std::string, which will be destroyed immediately after the full expression, left write_path dangled, dereference on it leads to UB.

    You can use std::string directly, or use a named std::string, then get the pointer from it.

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

    On the other hand,

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

    works fine, the c-style string literal has static storage duration and exists in memory for the life of the program, then write_path is always a valid pointer.