Segfault при использовании std :: string.c_str () в качестве аргумента для другого метода

0

Может ли кто-нибудь сказать мне, почему использование возвращаемого 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;
}
  • 1
    Компилировать все предупреждения и отладочную информацию (например, с помощью g++ -Wall -g ). Улучшайте код до тех пор, пока не появятся предупреждения. Используйте valgrind и ваш отладчик (например, gdb )
  • 0
    @ H2CO3, я открыт для предложений о том, как избежать «неформатированного, нечитаемого беспорядка». Просто сказать, что это так, я не могу принять во внимание при написании кода позже. На самом деле, ваш комментарий просто бесполезный и подстрекательский.
Теги:
string
stat
stl

1 ответ

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() записывать на адрес, исходящий от неинициализированного указателя (который, скорее всего, окажется в segfault).

Обратите внимание, что вам также потребуется изменить тип карты, чтобы она работала.

  • 0
    Инициализация указателя исправила ошибку. Благодарю.
  • 0
    @ Dazedy Позаботьтесь о том, как инициализировать указатель (утечки памяти и т. Д.). Код, который я разместил, должен нормально работать и не добавлять никаких дополнительных затрат.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню