我的程序中有一个stange行为,让我解释一下:
该函数如下所示:
void PrintDirTree(const char* dirName, size_t depth)
然后我有一个while循环,我进入目录并为下一个递归调用创建一个新字符串(printName在'examplefolder /'之前设置):
char* newDir = (char*)malloc(strlen(dirName) + strlen(dirEntry->d_name) + 1);
if (newDir != 0) {
memset(newDir, 0, sizeof(*newDir));
strcat(newDir, dirName);
if (dirName[strlen(dirName)-1] != '/') {
//printf("%d\n", dirName[strlen(dirName)-1]); <-- there i get the '5'
strcat(newDir, "/");
}
strcat(newDir, printName);
PrintDirTree(newDir, depth + 1);
free(newDir); newDir = 0;
} else {
fprintf(stderr, "error allocating memory\n");
return;
}
有时候(但每次都在同一个目录下)我会在字符串 dirName 的末尾得到一个ENQ(整数5),它被放到下一个函数调用中。 这种不当行为会导致不正确的opendir()调用。
答案 0 :(得分:3)
您正在使用
初始化内存memset(newDir, 0, sizeof(*newDir));
这不会清除整个内存,因为* newDir只是一个字符。当您开始写入数组时,您将覆盖初始零,因此是伪随机数据。使用正确的大小清除它或使用calloc而不是malloc。
答案 1 :(得分:2)
dirName
可能是“”。需要确保在数组开头之前不要访问。
// if (dirName[strlen(dirName)-1] != '/')
if (dirName[0] && dirName[strlen(dirName)-1] != '/')
malloc()
太小了。需要1表示潜在/
顺便说一句:printName
如何与dirEntry->d_name
相关?
// char* newDir = (char*)malloc(strlen(dirName) + strlen(dirEntry->d_name) + 1);
char* newDir = malloc(strlen(dirName) + strlen(printName) + 1 + 1);
@fpw关于初始化是正确的。
// memset(newDir, 0, sizeof(*newDir));
// strcat(newDir, dirName);
strcpy(newDir, dirName);