- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是函数list_directory
,我在其中丢失了分配的指针,并且以后无法释放它。这应该是类似 ls-a 的实现,当它找到一个目录时,它应该保存其名称,并在列出目录后,它应该递归地在当前目录中找到的目录上调用 list_directory
。但由于某种原因,它在途中丢失了一些元素。
int list_directory(int argc, char *argv[], struct check_info *chinfo, int dirs)
{
struct group *grp;
struct passwd *pwd;
struct stat file_info;
struct tm *mtime;
struct dirent *dir_info;
int subdirs = 0;
int printsubdir = 0;
int skip_newline = 1;
char timebuffer[26];
char **recursqueue;
if (chinfo->param_R)
{
if ((recursqueue = malloc(argc * sizeof(char*))) < 0)
perror("malloc");
}
if (dirs > -1)
{
for (int i = 0; i < chinfo->files; i++)
{
list_file(chinfo->argv_files[i], chinfo);
free(chinfo->argv_files[i]);
}
free(chinfo->argv_files);
}
for (int i = 1; i < argc; i++)
{
DIR *dp = opendir(argv[i]);
if (dp)
{
if (chinfo->param_R)
{
if ((recursqueue[subdirs] = malloc((256) * sizeof(char))) < 0)
perror("malloc");
strcpy(recursqueue[subdirs++], "./ls");
}
if (dirs+chinfo->files > 1 || chinfo->param_R)
{
if (!skip_newline || dirs == -1 || chinfo->files)
printf("\n%s:\n", argv[i]);
else
printf("%s:\n", argv[i]);
}
skip_newline = 0;
if (chinfo->param_l)
{
dir_indent_info(argv[i], chinfo);
printf("total %lu\n", chinfo->blocks_total/2);
}
while ((dir_info = readdir(dp)) != NULL)
{
if (!strcmp(".", dir_info->d_name) ||
!strcmp("..", dir_info->d_name))
{
continue;
}
else if (!strncmp(".", dir_info->d_name, 1)
&& !chinfo->param_A)
{
continue;
}
else
{
char path[strlen(argv[i]) + strlen(dir_info->d_name) + 1];
sprintf(path, "%s/%s", argv[i], dir_info->d_name);
if (lstat(path, &file_info) == -1)
continue;
switch (file_info.st_mode & S_IFMT)
{
case S_IFBLK: printf("b"); break;
case S_IFCHR: printf("c"); break;
case S_IFDIR: printf("d");
if (chinfo->param_R)
{
printsubdir = 1;
recursqueue[subdirs] = malloc((256) * sizeof(char));
strcpy(recursqueue[subdirs++], path);
}
break;
case S_IFIFO: printf("p"); break;
case S_IFLNK: printf("l"); break;
case S_IFREG: printf("-"); break;
case S_IFSOCK: printf("s"); break;
default: printf("?"); break;
}
if (chinfo->param_l)
{
printf( (file_info.st_mode & S_IRUSR) ? "r" : "-");
printf( (file_info.st_mode & S_IWUSR) ? "w" : "-");
printf( (file_info.st_mode & S_IXUSR) ? "x" : "-");
printf( (file_info.st_mode & S_IRGRP) ? "r" : "-");
printf( (file_info.st_mode & S_IWGRP) ? "w" : "-");
printf( (file_info.st_mode & S_IXGRP) ? "x" : "-");
printf( (file_info.st_mode & S_IROTH) ? "r" : "-");
printf( (file_info.st_mode & S_IWOTH) ? "w" : "-");
printf( (file_info.st_mode & S_IXOTH) ? "x" : "-");
printf(" %*lu", numlen(chinfo->link_len), file_info.st_nlink);
pwd = getpwuid(file_info.st_uid);
printf(" %-*s", chinfo->usr_len, pwd->pw_name);
grp = getgrgid(file_info.st_gid);
printf(" %-*s", chinfo->grp_len, grp->gr_name);
printf(" %*lu", numlen(chinfo->size_len), file_info.st_size);
mtime = localtime(&file_info.st_mtime);
strftime(timebuffer, 26, "%b %e %R", mtime);
printf(" %s", timebuffer);
}
printf(" %s\n", dir_info->d_name);
}
}
if (printsubdir)
{
if((list_directory(subdirs, recursqueue, chinfo, -1)) < 0)
printsubdir = -1;
for (int i = 0; i < subdirs; i++)
{
free(recursqueue[i]);
}
if (printsubdir < 0)
return -1;
}
closedir (dp);
subdirs = 0;
}
}
if (chinfo->param_R)
free(recursqueue);
return 0;
}
我将argv
传递给dir_indent_info
,所以这里是:
int dir_indent_info(char* dirpath, struct check_info *chinfo)
{
struct dirent *dir_info;
struct stat file_info;
struct group *grp;
struct passwd *pwd;
reset_info(chinfo);
DIR *dp = opendir(dirpath);
if (dp)
{
while ((dir_info = readdir(dp)) != NULL)
{
if (!strcmp(".", dir_info->d_name) ||
!strcmp("..", dir_info->d_name))
{
continue;
}
char path[strlen(dir_info->d_name) + strlen(dirpath) + 1];
sprintf(path, "%s/%s", dirpath, dir_info->d_name);
if (lstat(path, &file_info) == -1)
{
perror("lstat()");
continue;
}
pwd = getpwuid(file_info.st_uid);
if (strlen(pwd->pw_name) > chinfo->usr_len)
chinfo->usr_len = strlen(pwd->pw_name);
grp = getgrgid(file_info.st_gid);
if (strlen(grp->gr_name) > chinfo->grp_len)
chinfo->grp_len = strlen(grp->gr_name);
chinfo->blocks_total += file_info.st_blocks;
if (file_info.st_size > chinfo->size_len)
chinfo->size_len = file_info.st_size;
if (file_info.st_nlink > chinfo->link_len)
chinfo->link_len = file_info.st_nlink;
}
closedir(dp);
}
else
{
perror("error");
return -1;
}
return 0;
}
Valgrind 输出:
==6361== WARNING: new redirection conflicts with existing -- ignoring it
--6361-- old: 0x0401cdc0 (strlen ) R-> (0000.0) 0x3809e181 ???
--6361-- new: 0x0401cdc0 (strlen ) R-> (2007.0) 0x04c31020 strlen
==6361==
==6361== HEAP SUMMARY:
==6361== in use at exit: 768 bytes in 3 blocks
==6361== total heap usage: 231 allocs, 228 frees, 596,108 bytes allocated
==6361==
==6361== Searching for pointers to 3 not-freed blocks
==6361== Checked 65,288 bytes
==6361==
==6361== 256 bytes in 1 blocks are definitely lost in loss record 1 of 2
==6361== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6361== by 0x4016FD: list_directory (ls.c:293)
==6361== by 0x401DFB: list_directory (ls.c:385)
==6361== by 0x401F55: main (ls.c:415)
==6361==
==6361== 512 bytes in 2 blocks are definitely lost in loss record 2 of 2
==6361== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6361== by 0x4016FD: list_directory (ls.c:293)
==6361== by 0x401DFB: list_directory (ls.c:385)
==6361== by 0x401DFB: list_directory (ls.c:385)
==6361== by 0x401F55: main (ls.c:415)
==6361==
==6361== LEAK SUMMARY:
==6361== definitely lost: 768 bytes in 3 blocks
==6361== indirectly lost: 0 bytes in 0 blocks
==6361== possibly lost: 0 bytes in 0 blocks
==6361== still reachable: 0 bytes in 0 blocks
==6361== suppressed: 0 bytes in 0 blocks
==6361==
==6361== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 1 from 1)
为 char** 数组分配指针:
if (chinfo->param_R)
{
if ((recursqueue = malloc(argc * sizeof(char*))) < 0)
perror("malloc");
}
分配第一个元素并为其分配 ./ls 以模拟参数输入:
if (chinfo->param_R)
{
if ((recursqueue[subdirs] = malloc((256) * sizeof(char))) < 0)
perror("malloc");
strcpy(recursqueue[subdirs++], "./ls");
}
如果当前文件是目录,我们将其添加到recursqueue
case S_IFDIR: printf("d");
if (chinfo->param_R)
{
printsubdir = 1;
recursqueue[subdirs] = malloc((256) * sizeof(char));
strcpy(recursqueue[subdirs++], path);
}
使用收集的子目录路径调用相同的函数:
if (printsubdir)
{
if((list_directory(subdirs, recursqueue, chinfo, -1)) < 0)
printsubdir = -1;
for (int i = 0; i < subdirs; i++)
{
free(recursqueue[i]);
}
if (printsubdir < 0)
return -1;
}
最佳答案
你的代码有很多问题,比如巨大的函数、未初始化的变量、变量的流行名称、为不相关的目的重用变量、不必要的广泛变量范围、分配内存的模糊所有权、条件表达式中的赋值、小于指针与0等的比较
至于内存泄漏,这样的代码很容易发生,例如:
./ls
字符串分配第一个 recursqueue
项,但如果 printsubdir
未设置为 1,则它将永远不会被释放;recursqueue
数组,但是如果list_directory
返回的值小于0,那么它永远不会被释放(并且linedir
也不会被调用);关于c - 通过递归函数传递分配的数组时出现内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44217396/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!