2016-11-21 5 views
-2

지정한 디렉토리의 파일에 대한 정보를 나열하려하지만 메모리 덤프 코어 덤프 오류가 발생합니다. 목록 디렉토리 방법 :c - scandir, memory fault 코어 덤프 오류

int listdir(char *path) { 

struct dirent **dirlist; 
int n; 
char *fullpath; 
n = scandir(path, &dirlist, NULL, alphasort); 

while (n--) { 
    strcpy(fullpath, path); 
    strcat(fullpath, dirlist[n]->d_name); 
    (void)printfinf(fullpath);  

    free(dirlist[n]); 
} 
free(dirlist); 

return 0; 
} 

Printfinf 방법 -이 방법이 잘 작동, 당신은하지 않았다, 당신은 대상 경로 문자열에 대한 메모리를 할당하는 데 필요한 파일

int printfinf(char *path) { 

struct stat info; 
struct passwd *pswd; 
lstat(path,&info);   
pswd = getpwuid(info.st_uid); 
char *modestr = mode2str(info.st_mode, getuid(), getgid()); 
char *timestr = time2str(info.st_mtime); 

printf("%s %s %10lld %s %s\n", modestr, pswd->pw_name, info.st_size, timestr, path); 

char c = modestr[0]; 

if(c == 'd') 
    return FTYPE_DIR; 
else if(c == 'f') 
    return FTYPE_REG; 
else if(c == 'e') 
    return FTYPE_EXE; 
else if(c == 'l') 
    return FTYPE_LNK; 
else return FTYPE_OTH; 

} 
+1

안녕하세요! 질문에서 코드를 삭제 한 이유는 무엇입니까? 이제는 완전히 불분명합니다. – ventiseis

+1

질문에서 코드를 삭제하지 마십시오. 스택 오버플로에 오신 것을 환영합니다. 여기서 '감사합니다'라고 말하면 가장 좋은 방법은 위의 좋은 질문과 유용한 답변 (충분한 답변을 얻으려면 명을 얻은 것임)이며, 질문에 대한 가장 유용한 답변을 수락하면됩니다. (이는 또한 평판에 대한 귀하의 에 약간의 도움이됩니다). [정보] 페이지 및 [질문은 어떻게합니까? 여기에 있습니까?] (http://stackoverflow.com/help/how-to-ask) 및 [내 질문에 대한 대답은 무엇을해야합니까? ?] (http://stackoverflow.com/help/someone-answers) –

답변

2

에 대한 정보를 출력합니다. 당신이 당신의 터미널에 man strcpy를 입력하면

, 당신은 strcpy()의 첫 번째 매개 변수는 문제를 해결할 것이

char fullpath[PATH_MAX]; 

같은 배열을 사용하도록 코드를 변경, 미리 할당 된 메모리를 가리키는 것을 알 것입니다.

경고 : 경고하지 마십시오!

함수의 반환 값을 무시하면 대부분 무시됩니다 (대부분의 시간이). 좋은 오류 처리를 수행하기 위해 반환 된 함수를 확인해야합니다.

또한 strcat()을 사용하지 마십시오. 대신 (을 제안 변경 후 )

int length; 
length = snprintf(fullpath, sizeof(fullpath), "%s/%s", path, dirlist[n]->d_name); 
if ((length >= sizeof(fullpath)) || (length == -1)) { 
    fprintf(stderr, "Either, there is no room for the " 
        "target string or an error occurred\n"); 
} 
+0

그래, 고마워, 나는 아주 조금 이상하다. 그래서 나는 갑자기 멈춰서서 걱정했다. –

+0

@AhamadBoali 이는 정의되지 않은 동작으로, [tag : c]에서 발생합니다. 때로는 잘될 수도 있지만 갑자기 ... 오! 미안, 그건 네가 한 말이다. :) –