2011-09-26 3 views
1

다음 함수를 실행할 때 SIGSEGV가 발생합니다. 나는 이유를 알 수 없다 ... 아무도 도와 줄 수 있습니까? 올바른 방향으로 나를 가리켜 주시겠습니까? 필자는 디렉터리 계층 구조에서 중복 파일을 검색하는 큰 프로그램의 일부분입니다.왜 glib로 SIGSEGV를 얻을 수 있습니까?

는 루프 테스트 조건을 수행 어쩌면 (루프 내부의 첫 번째 줄) 두 번째 filename = g_dir_read_name(dp); 제거

#include <stdio.h> 
#include <stdlib.h> 
#include <glib.h> 

int main (int argc , char *argv[]) { 
    GError *error = NULL; 
    const gchar* filename = NULL; 
    gchar *directory_path = "/tmp"; 
    GDir* dp = g_dir_open (directory_path, 0, &error); 
    if (error) { 
     g_warning("g_dir_open() failed: %s\n", error->message); 
     g_clear_error(&error); 
     return 1; 
     } 
    while ((filename = g_dir_read_name(dp))){ 
     filename = g_dir_read_name(dp); 
     gchar* path = g_build_filename (directory_path, filename, NULL); 
     printf("%s\n", filename); 
     g_free (path); 
    } 
    return 0; 
} 
+0

나는 glib에 익숙하지 않지만'gchar * directory_path = "/ tmp"'냄새가 난다. 그것을 const로 만드십시오. – eran

+0

valgrind (http://valgrind.org/)에서 실행 해보고 그 내용을 확인하십시오. –

답변

2

, 그것은 이미 디렉토리에있는 다음 항목에 filename을 할당합니다. 루프 내에서 해당 행을 다시 실행하면 마지막 행 다음에 하나 이상의 항목을 읽으려고 시도합니다. 디렉터리에 홀수 개의 파일이있는 경우 filename은 루프가 마지막으로 실행될 때 null 값을 가리킬 수 있습니다.

+1

고마워요! 그것은 그것을 고쳤다! 나는 나의 기능을 재구성 할 때 진술을 삭제하는 것을 잊었다. – jakschu

+0

문제 없습니다. –

관련 문제