有谁能告诉我为什么使用来自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;
}
答案 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()
写入来自未初始化指针的地址(很可能最终会出现在段错误中)。
请注意,您还需要更改地图类型才能使其正常工作。