无法将wchar_t的内容复制到另一个是malloc&#d; d?的wchar_t var中?

时间:2017-04-07 19:23:54

标签: c malloc

我有一个名为DirToEmpty的var,它保存了temp dir的路径。

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

预期行为的示例

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

为此,我malloc' d TempBufDir,并尝试将每个字符从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

1 个答案:

答案 0 :(得分:1)

除了需要加倍malloc参数外,该循环中还有一堆错误,

  • 使用i和j作为源索引和目标索引不一致
  • 错误的循环条件
  • Spurious + =
  • 在添加额外的\
  • 时忘了增加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)。