c - 使用 realloc 进行分配
问题描述
我正在尝试列出特定目录的子目录文件。但是,我收到错误“realloc(): invalid next size”。我正在使用 realloc(),因为进一步,我将对数组进行排序(按时间修改,按 lex ...)
DIR *dir2=NULL;
DIR *dir1;
struct dirent *sd;
struct dirent *ptr;
char **arr2=malloc(sizeof(char *));
int size=0;
dir1=opendir(directory); //current dir
while((sd=readdir(dir1))!=NULL)
{
if(sd->d_type==DT_DIR){ //checking,is it a dir?
dir2=opendir(sd->d_name); //parent dir
printf("\n./%s\n",sd->d_name); //printing parent directory's name
while((ptr=readdir(dir2))!=NULL){
if(size>0){
arr2=realloc(arr2,(size)*sizeof(char*));
arr2[size]=malloc(50);
}
arr2[size]=ptr->d_name;
size++;
}
for(int i=0;i<size;i++)
{
printf("%s ",arr2[i]); //listing files and directories.
}
}
}
是的,你在我的代码中看不到 free(),在我的真实代码中我正在做 free(),所以问题出在 realloc 中(我猜)。
解决方案
int size=0;
在程序开始时,您初始化大小等于ZERO
.
您的代码第一次到达realloc
函数时:
arr2=realloc(arr2,(size)*sizeof(char*));
的值size
等于1
。所以,现在arr2
只为ONE
指针分配char *
。然后您尝试访问 的第二个值arr2
:
arr2[size]=malloc(50); // here, size = 1
您必须将 malloc 函数更改为:
arr2=realloc(arr2,(size+1)*sizeof(char*));
malloc
检查orrealloc
函数的返回值更安全。因为有时候,它会失败,然后让你的程序运行得不好。
推荐阅读
- swift - 使用 SwiftUI 自定义操作表
- python - 支持向量机的数学模型
- python - 如何为python中的短语而不是单个单词创建wordcloud
- javascript - 为什么 Javascript 中的这个 for 循环给我一个数字而不是从 0 到 4 的数字列表?
- wordpress - 基于用户角色的 Woocommerce 新客户电子邮件
- javascript - (NodeJS)可以维护客户端索引变量以使用 EJS 遍历数据库元素吗?
- javascript - Javascript 10 天 - 第 3 天:数组 - HackerRank
- c++ - 如何从文件夹视图中删除组
- python - 根据 Keras 中的图像和子文件夹名称设置 X 和 y 用于训练 CNN
- c++ - QSqlDatabasePrivate::addDatabase: 重复连接名称 'qt_sql_default_connection'