使用std :: string.c_str()作为另一个方法的参数时的Segfault

时间:2013-11-20 18:06:59

标签: c++ string stl stat

有谁能告诉我为什么使用来自c_str()的返回const char *作为stat(const char *,stat *)中的参数会导致程序出现段错误?我认为我已经将我的段错误缩小到由该行造成的,但我不确定要使用什么。我尝试使用strcpy()将字符串复制到字符数组中,但这只会导致程序在方法返回时出现段错误,这并不是更好。

DIR * dir_p;
struct dirent *dir_entry_p;
list<string> files;
dir_p = opendir(".");
//push all file names to a list
while((dir_entry_p = readdir(dir_p))!=NULL){
    string name = dir_entry_p->d_name;
    files.push_front(name);
}
closedir(dir_p);
files.sort();
//count total blocks
//iterate through list
map<string,struct  stat*> fileStats;
struct stat * entry;
for(list<string>::iterator it = files.begin(); it != files.end(); it++){
    stat(it->c_str(),entry);
    fileStats[*it]=entry;
    cout<<entry->st_blocks<<" "<<*it<<endl;
}

1 个答案:

答案 0 :(得分:6)

我认为这不是c_str()制造麻烦,而是你如何使用struct stat
您应该创建一个struct stat实例并传递它的地址:

// ...

//iterate through list
map<string,struct  stat> fileStats;
for(list<string>::iterator it = files.begin(); it != files.end(); it++){
    struct stat entry;
    stat(it->c_str(),&entry);
    fileStats[*it]=entry;
    cout<<entry.st_blocks<<" "<<*it<<endl;
}

你正在做的是让stat()写入来自未初始化指针的地址(很可能最终会出现在段错误中)。

请注意,您还需要更改地图类型才能使其正常工作。