C++ C++;extern const char*未按预期工作

C++ C++;extern const char*未按预期工作,c++,pointers,char,constants,extern,C++,Pointers,Char,Constants,Extern,我以前使用过extern关键字,但现在我遇到了一个非常奇怪的问题 首先,我的common.hh文件包含外部变量声明: //some extern declarations extern const char* PATH; 在my main.cc中,我执行以下操作(暂时忽略cout): 在Other.cc中,访问路径时出现问题: #include "Other.hh" void someFunction(...){ std::cout << PATH << std::en

我以前使用过extern关键字,但现在我遇到了一个非常奇怪的问题

首先,我的common.hh文件包含外部变量声明:

//some extern declarations
extern const char* PATH;
在my main.cc中,我执行以下操作(暂时忽略cout):

在Other.cc中,访问路径时出现问题:

#include "Other.hh"
void someFunction(...){
std::cout << PATH << std::endl; //When accessing PATH here again it prints garbage

我只是不明白为什么这会解决问题,因为理论上
tmp
somePath
应该具有相同的作用域,并且在other.cc中执行函数调用之前不应该销毁。换句话说:我在other.cc中的函数调用在
somePath
的作用域结束之前。

somePath.c_str()的生存期由
somePath
变量绑定。一旦超出范围,
PATH
就指向将被重用的内存


你能把
PATH
变成
std::string
而不是
char*
?如果没有,则必须使用
strdup
或类似的方法复制
somePath.c_str()
的值。

somePath.c_str()的生存期由
somePath
变量绑定。一旦超出范围,
PATH
就指向将被重用的内存


你能把
PATH
变成
std::string
而不是
char*
?如果没有,则必须使用
strdup
或类似的方法复制
somePath.c_str()
的值。

c_str
std::string
的一种方法,如果字符串被更改或销毁,则该方法将无效。例如,请参阅上一篇文章中有关
c_str
生命周期的详细信息

您可以制作
PATH
a
std::string
并让它进行复制,或者在分配了足够内存的情况下手动将其复制到
char*
中。然后想想什么时候取消分配


编辑-响应您的编辑

你在哪里

std::string tmp = somePath;
PATH = tmp.c_str();
您声称“tmp和somePath应该具有相同的作用域”-它们没有。
PATH
在全局范围内,您已在此处将其指定为指向
tmp
c_str()

c_str
std::string
的一种方法,如果字符串被更改或销毁,则该方法无效。例如,请参阅上一篇文章中有关
c_str
生命周期的详细信息

您可以制作
PATH
a
std::string
并让它进行复制,或者在分配了足够内存的情况下手动将其复制到
char*
中。然后想想什么时候取消分配


编辑-响应您的编辑

你在哪里

std::string tmp = somePath;
PATH = tmp.c_str();
您声称“tmp和somePath应该具有相同的作用域”-它们没有。
PATH
在全局范围内,您已在此处将其指定为指向
tmp
c_str()

请提供一个最小的、完整的、可验证的示例()。请提供一个最小的、完整的、可验证的示例()。非常感谢。我的问题通过执行字符串tmp=somePath得到解决;PATH=tmp.c_str();但是我仍然不知道为什么,因为tmp和somePath应该有相同的生命周期。在somePath超出作用域之前,我使用PATH,那么为什么即使somePath.c_str()仍在作用域中,PATH也会更改?设置
PATH
后,您没有修改
somePath
,是吗
c_str
返回指向字符串缓冲区的原始指针。如果您修改字符串,那么缓冲区也将被修改。非常感谢。我的问题通过执行字符串tmp=somePath得到解决;PATH=tmp.c_str();但是我仍然不知道为什么,因为tmp和somePath应该有相同的生命周期。在somePath超出作用域之前,我使用PATH,那么为什么即使somePath.c_str()仍在作用域中,PATH也会更改?设置
PATH
后,您没有修改
somePath
,是吗
c_str
返回指向字符串缓冲区的原始指针。如果你修改字符串,那么缓冲区也会被修改。非常感谢,我的问题已经解决了,尽管我不完全理解为什么。我编辑了我的问题,以表明在main.cc中,other.hh/cc中的某些函数调用在somePath应该仍在作用域内的地方完成,因此在分配
路径时不会被破坏,这将是正常的,但如果您稍后尝试阅读,在
tmp
超出作用域后,指针可能会指向垃圾。非常感谢,我的问题已经解决了,尽管我不完全明白为什么。我编辑了我的问题,以表明在main.cc中,other.hh/cc中的某些函数调用是在somePath应该仍在作用域内的地方完成的,因此在分配
PATH
时不会被破坏,但如果您稍后尝试阅读它,在
tmp
超出作用域后,指针可能会指向垃圾。
std::string tmp = somePath;
PATH = tmp.c_str();
std::string tmp = somePath;
PATH = tmp.c_str();