变量始终为空
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
始终是一个有效的指针。
我在初始化全局变量时遇到问题。我的 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
始终是一个有效的指针。