0

我的 C++ 代码中有一个简单的行来创建一个新文件:

string fileName = "test";

// Create a file named "test"
rc = pf->CreateFile(fileName.c_str());

内部CreateFile函数(const char *fileName作为参数,我有以下代码片段;

// Create the file in current working directory
char *path = NULL;
path = getcwd(path, 0);
path = strcat(path, "/");
path = strcat(path, fileName);
FILE *fHandle = fopen(path, "wb");

该字符串path包含要创建的文件的完整绝对路径。文件名为test. 但是,当我运行代码时,确实创建了文件,但是它的名称包含不可打印的字符(代码在以下两个命令之间运行):

在此处输入图像描述

请提出什么可能是错的。

4

2 回答 2

2

man getcwd

作为 POSIX.1-2001 标准的扩展,如果 buf 为 NULL,Linux (libc4, libc5, glibc) getcwd() 使用 malloc(3) 动态分配缓冲区。在这种情况下,分配的缓冲区具有长度大小,除非大小为零,当 buf 被分配到必要的大小时。调用者应该释放(3)返回的缓冲区。

这意味着没有多余的空间path可以追加,并导致覆盖path指向的数组的边界,从而导致未定义的行为,并且可能是无法打印字符的原因。

要构建能够保存路径的缓冲区,您需要确定完整大小malloc()并构建它:

char *path;
path = getcwd(path, 0);
if (path)
{
    /* The '+2' is for null terminator and the '/'. */
    const size_t size = strlen(path) + strlen(fileName) + 2;
    char* fullPath = malloc(size);
    if (fullPath)
    {
        sprintf(fullPath, "%s/%s", path, fileName);
        /* fopen() ... */
        free(fullPath);
    }
    free(path);
}
于 2012-10-09T15:34:16.973 回答
1

您的path变量可能不会以\0.

于 2012-10-09T15:28:39.457 回答