Может ли кто-нибудь сказать мне, почему использование возвращаемого const char * из c_str() в качестве аргумента в stat (const char *, stat *) заставляет программу segfault? Я думаю, что я сузил мой segfault, чтобы быть вызванным этой линией, но я не уверен, что использовать вместо этого. Я попытался скопировать строку в массив символов, используя strcpy(), но это только что вызвало программу segfault по мере возвращения метода, что не намного лучше.
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;
}
Я не думаю, что здесь 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()
записывать на адрес, исходящий от неинициализированного указателя (который, скорее всего, окажется в segfault).
Обратите внимание, что вам также потребуется изменить тип карты, чтобы она работала.
g++ -Wall -g
). Улучшайте код до тех пор, пока не появятся предупреждения. Используйте valgrind и ваш отладчик (например,gdb
)