C++ C++;extern const char*未按预期工作
我以前使用过extern关键字,但现在我遇到了一个非常奇怪的问题 首先,我的common.hh文件包含外部变量声明: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
//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
astd::string
并让它进行复制,或者在分配了足够内存的情况下手动将其复制到char*
中。然后想想什么时候取消分配
编辑-响应您的编辑 你在哪里
std::string tmp = somePath;
PATH = tmp.c_str();
您声称“tmp和somePath应该具有相同的作用域”-它们没有。
PATH
在全局范围内,您已在此处将其指定为指向tmp
的c_str()
c_str
是std::string
的一种方法,如果字符串被更改或销毁,则该方法无效。例如,请参阅上一篇文章中有关c_str
生命周期的详细信息
您可以制作PATH
astd::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();