字符串末尾的ENQ

时间:2013-11-27 18:42:09

标签: c string posix

我的程序中有一个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()调用。

2 个答案:

答案 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);