2013-11-20 3 views
0

누구도 stat (const char *, stat *)의 인수로 c_str()에서 반환 된 const char *를 사용하면 프로그램이 세그 폴트? 나는 그 선에 의한 나의 segfault를 좁혔다 고 생각하지만, 대신 무엇을 사용해야하는지 잘 모르겠습니다. strcpy()를 사용하여 문자열을 문자 배열로 복사하려고 시도했지만 메서드가 반환 될 때 프로그램이 segfault로 인해 발생했습니다. 당신이 struct stat를 사용하는 방법Segfault 다른 메서드에 대한 인수로 std :: string.c_str() 사용할 때

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] (http://valgrind.org/)와 ** 디버거 ** (예 :'gdb') –

+0

@ H2CO3을 사용하십시오. "형식이 지정되지 않고 읽을 수없는 혼란"을 피하는 방법에 대한 제안이 있습니다. 나중에 코드를 작성할 때 고려해야 할 것은 아닙니다. 그것이 그렇듯이, 귀하의 의견은 단순히 도움이되지 않습니다 염증. – LucienK

답변

6

는 나는 여기 c_str() 만드는 문제를 생각하지만,하지 않습니다.
당신은 주소의 struct stat 인스턴스를 생성하고 전달해야합니다 :

당신이 (대부분 segfault의에 종료됩니다) 초기화되지 않은 포인터에서 나오는 주소로 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; 
} 

.

이 작업을 수행하려면지도 유형을 변경해야합니다.

+0

포인터를 초기화하면 segfault가 수정되었습니다. 감사. – LucienK

+0

@Dazedy 포인터를 어떻게 초기화하는지 (메모리 누수 등)주의하십시오. 게시 한 코드는 잘 작동하고 추가 오버 헤드가 추가되지 않습니다. –

+0

알았어, 도와 줘서 고마워. – LucienK