c - scandir,内存故障核心转储错误

时间:2016-11-21 19:26:57

标签: c scandir

我正在尝试列出有关指定目录中文件的信息,但我收到内存故障核心转储错误。 列表目录方法:

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 个答案:

答案 0 :(得分: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");
}