【发布时间】:2021-12-01 09:50:31
【问题描述】:
我正在尝试制作一个程序来创建一个目录,在该目录中创建多个目录,然后在每个目录中创建一个文件。我似乎无法打开那些“多个目录”,以便我可以将我的文件放在那里。我尝试使用name3 作为参数,还尝试使用name3 的值创建一个const char*,但没有任何效果。
error: malloc.c:2379: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Aborted (core dumped)
这是我的代码
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
int make_directory(char * name) {
int checker=mkdir(name, S_IRWXU | S_IRWXG | S_IRWXO);
return checker;
}
char** getNames() {
char** names=malloc(10*sizeof(char*));
for(int i=0;i<10;i++) {
if(i==9) {
names[i]=malloc(3*sizeof(char));
names[i][0]='1';
names[i][1]='0';
names[i][2]='\0';
} else {
names[i]=malloc(2*sizeof(char));
names[i][0]=49+i;
names[i][1]='\0';
}
}
return names;
}
int makeTenDirs() {
char **names=getNames();
char *name2;
for(int i=0;i<10;i++) {
name2=NULL;
name2=getcwd(NULL,0);
strncat(name2,"/input/dir",11);
strncat(name2,names[i],1);
int s=make_directory(name2);
}
name2=NULL;
name2=getcwd(NULL,0);
strncat(name2,"/input/dir",11);
strncat(name2,names[0],1);
strncat(name2,"0",2);
int s=make_directory(name2);
}
int main() {
char **names=getNames();
FILE *file;
DIR *dir;
DIR *dir2;
struct dirent *dent;
char * name1="./input";
char *name3;
int proceed=make_directory("./input");
if(proceed==-1) {
printf("Error making the directory\n");
}
makeTenDirs();
dir=opendir("./input");
if(dir!=NULL) {
name3=getcwd(NULL,0);
while((dent=readdir(dir))!=NULL){
if(strcmp(dent->d_name,"..")!=0 && strcmp(dent->d_name,".")!=0) {
name3=getcwd(NULL,0);
strncat(name3,"/input/",8);
strncat(name3,dent->d_name,10);
printf("%s\n",name3);
dir2=opendir(name3);
if(dir2!=NULL) {
printf("alo");
}
}
}
}
closedir(dir);
free(names);
return 0;
}
关于如何打开目录(或者将文件放入其中)的任何提示?
【问题讨论】:
-
来自
getcwdman page:“如果buf是NULL...size是0...buf分配得尽可能大”。name2可能没有足够的空间容纳后续的strncats,并且您正在溢出该缓冲区。 -
我应该如何绕过它?有什么办法可以打开我的目录?
-
你可以给
name2一个足够大的初始尺寸,比如char name2[512]; getcwd(name2, sizeof name2);,或者在getcwd返回时保持原样和reallocname2为更大的尺寸。手册页显示“路径名作为函数结果返回,并通过参数buf,如果存在。” IMO 有点奇怪,但这给了你一些选择。您应该始终检查NULL的返回值,指示错误。 -
这是我看到的第一个潜在问题,可能还有其他问题。
-
不要做类似
49+i的事情。请改写'1'+i。请注意,您可能会在此处引入一个错误。