C ++ extern const char *无法按预期工作

时间:2017-03-14 11:45:04

标签: c++ pointers char const extern

之前我使用过extern关键字,但现在我有一个非常奇怪的问题。

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

//some extern declarations
extern const char* PATH;

在我的main.cc中,我执行以下操作(暂时忽略cout):

#include "common.hh"
const char* PATH;

int main(const int argc, const char* argv[]){
PATH = somePath.c_str();
//std::cout << PATH << std::endl; //will print the correct path
//std::cout << std::string(PATH) << std::endl; //will fix the problem occuring later
//some function calls to other files where PATH is used
//... somePath still in scope ...
//... somePath is about to be destroyed
}

现在我有其他文件Other.hh和Other.cc出现问题: 首先是我的Other.hh

#include "common.hh"
//function declarations and some other stuff

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

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

在我的文件Other.cc中,我需要在main.cc中定义的const char * PATH,但由于某种原因,PATH已经改变。如果我在main.cc中的某个地方执行std :: string(PATH),如上面的cout中所示,整个问题就解决了。我没有弄错,所有其他外部变量都可以正常工作。

修改 问题现在已解决。我刚刚在main.cc中执行了以下操作:

std::string tmp = somePath;
PATH = tmp.c_str();

我只是不明白为什么这样可以解决这个问题,因为理论上tmpsomePath应该有相同的范围,直到在other.cc中调用函数之后才能销毁它执行。换句话说:我在other.cc中的函数调用是在somePath的范围结束之前。

2 个答案:

答案 0 :(得分:2)

somePath.c_str()的生命周期受somePath变量的约束。一旦超出范围,PATH指向将被重用的内存。

您可以PATH代替std::string代替char*吗?如果没有,则必须使用somePath.c_str()或类似内容复制strdup的值。

答案 1 :(得分:1)

c_strstd::string的一种方法,如果字符串被更改或销毁,该方法将变为无效。例如,请参阅之前question中有关c_str生命周期的详细信息。

您可以将PATH设为std::string并让它复制或手动复制到已分配足够内存的char *。然后考虑何时解除分配。

修改 - 回复您的修改

你在哪里

std::string tmp = somePath;
PATH = tmp.c_str();

你声称&#34; tmp和somePath应该具有相同的范围&#34; - 他们不。 PATH属于全球范围,您已将其指定为tmp&#39; s c_str()