c - 无法将 wchar_t 的内容复制到另一个已 malloc 的 wchar_t var 中?

标签 c malloc

我有一个名为 DirToEmpty 的变量,它保存临时目录的路径。

我有另一个名为 TempBufDir 的变量,它将保持与 DirToEmpty 相同的值,但反斜杠被转义。

预期行为示例:

wchar_t DirToEmpty[MAX_PATH] = TEXT("C:\xxx\yyy\zzz");
wchar_t TempBufDir[MAX_PATH] = TEXT("C:\\xxx\\yyy\\zzz");

为此,我对 TempBufDir 进行了 malloc,并尝试将 DirToEmpty 中的每个字符复制到 TempBufDir 中。

代码如下:

// Count number of backslashes
int backslashes = 0;
for (int i = 0; *(DirToEmpty + i); i++) {
    if (*(DirToEmpty + i) == TEXT('\\')) {
        backslashes += 1;
    }
}

// Size of TempBufDir = Length of DirToEmpty + backslashes(escaped) + 1
size_t lpBufSize     = wcslen(DirToEmpty) + backslashes + 1;
wchar_t * TempBufDir = (wchar_t *) malloc (lpBufSize);

if (TempBufDir == NULL) {
    return 9;
}

for (int i = 0, j = 0; *(DirToEmpty)+i; i++, j++) {

    // Copy the char
    *(TempBufDir + i) += *(DirToEmpty + j);

    // If the char is a backslash, add another one to escape it
    // If kth element is a backslash, k+1th element should also be a backslash
    if (*(DirToEmpty + j) == TEXT('\\')) {
        *(TempBufDir + (i + 1)) = TEXT('\\');
    }
}

但是,我一执行程序,程序似乎就崩溃了。

查看帖子底部的屏幕截图。

编辑:如果我删除最后一个 for 循环,程序似乎会正常退出。所以我认为它与缓冲区大小有关?

编辑2:我将malloc行更改为:

wchar_t * TempBufDir = (wchar_t *) malloc (lpBufSize * sizeof(wchar_t));

这并没有改变任何事情。程序仍然崩溃。

编辑 3:

enter image description here

最佳答案

除了需要加倍 malloc 参数之外,该循环中还有很多错误,

  • i 和 j 作为源索引和目标索引的使用不一致
  • 循环条件错误
  • 虚假+=
  • 添加额外的内容时忘记增加 i\
  • 需要添加0终止符

这是我修复它的尝试:

for (int i = 0, j = 0; *(DirToEmpty+j); i++, j++) {
    *(TempBufDir + i) = *(DirToEmpty + j);

    if (*(DirToEmpty + j) == TEXT('\\')) {
        *(TempBufDir + (i + 1)) = TEXT('\\');
        i++;
    }
}
TempBufDir[i] = 0;

顺便说一句,在 C 语言中,如果 p 是指针且 i 是整数,则 *(p+i) 与 p[i] 相同。 您应该使用 DirToEmpty[i] 而不是 *(DirToEmpty+1)。

关于c - 无法将 wchar_t 的内容复制到另一个已 malloc 的 wchar_t var 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43285699/

相关文章:

c - 使用流在 *nix 进程之间传输输入/输出

c - 嵌入式设备的内存分配/释放

c - 访问超出 malloc() 的内存

C 编程 malloc 和 NULL

c - 函数中的 Printf 更改 main 中的输出值

c - 如何使用 DDD 查找进程卡住的位置

c - 使用 select() 阻塞,直到获得或失去客户

c - 如何重用 C 中的字符串而不让旧值出现在内存中?

c - 修改 C 函数内的二维 malloc 数组

windows - free 和 malloc 的 Visual C++ 线程安全?