我刚开始用C ++编程,我发现了一个尴尬的问题。基本上:
:
,其中包含文件的完整路径。char[MAX_LEN]
)指向文件的名称(没有完整路径)。当我构造这个类时,我发现(char*
)指针实际指向构造函数中的局部变量,从而获得错误的结果。
准确地说,课程是:
char*
例如,主要包括创建几个“File_t”实例并填充几个文件/ some / path / foo1,2,...
class File_t{
public:
char fullPath[1024];
char* name;
File_t(){}; // Default constructor
File_t(const char* fullPath_){
/* Copy the input name on fullPath */
strncpy(fullPath, fullPath_, sizeof(fullPath));
/* Auxiliary variable to remove the path */
char* auxstr=fullPath;
name = auxstr;
/* Loop to remove the path */
while(1){
auxstr = strstr(auxstr,"/");
if(auxstr){auxstr=auxstr+1; name=auxstr;}
else{break;}
}
}
};
程序输出为:
int main(int argc, char* argv[]){
const int N = 3;
File_t CC[N];
char fileName[100];
for ( int i = 0; i < N; i++){
sprintf(fileName,"%s%d","some/path/foo",i);
CC[i] = File_t(&fileName[0]);
}
cout << "Summary" << endl;
for (int i=0; i<N; i++) cout << "File " << CC[i].name << " in " << CC[i].fullPath << endl;
return 0;
}
也就是说,名称指向构造函数的一些局部变量。我在Apple,GNU和英特尔编译器方面存在这个问题。
PS:我知道我应该避免在C ++中使用C风格的字符串,但这只是为了学习C ++基础知识。
答案 0 :(得分:5)
代码中的问题是一个破坏的赋值运算符(和复制构造函数)。在这一行:
CC[i] = File_t(&fileName[0]);
您构建一个临时File_t
对象,然后将其分配给CC[i]
。 fullPath
是一个数组,因此复制了所有元素。这可以。但name
是一个指针,因此唯一复制的是指针本身。这是一个问题,因为它仍然指向临时对象的fullPath
。
在此语句结束时,临时对象将被销毁。现在CC[i].name
是一个无效的指针。
要解决此问题,请定义适当的赋值运算符。它可能会做类似的事情:
strcpy(fullPath, other.fullPath);
name = fullPath + (other.name - other.fullPath);
答案 1 :(得分:0)
Melpomene得到了答案。没有指出复制过程,指针指向局部变量。
如果添加了复制程序(遵循他的建议):
File_t& operator=(const File_t& other)
{
strcpy(fullPath, other.fullPath);
name = &fullPath[0] + (other.name - &other.fullPath[0]);
return *this;
}
然后程序就可以了。
谢谢大家的答案!