我正在尝试列出有关指定目录中文件的信息,但我收到内存故障核心转储错误。 列表目录方法:
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;
}
答案 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");
}