2017-04-07 19 views
0

私はと呼ばれるvarを持っています。これはtemp dirへのパスを保持しています。wchar_tの内容をmallocされた別のwchar_t varにコピーできませんでしたか?

TempBufDirと呼ばれる別のvarがありますが、これはDirToEmptyと同じ値を保持しますが、バックスラッシュはエスケープされます。

例の予想される動作このため

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

、私はTempBufDirをmallocさ、及びTempBufDirDirToEmptyから各文字をコピーしようとしました。ここで

コードです:

// 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('\\'); 
    } 
} 

しかし、プログラムはすぐに私はプログラムを実行するとクラッシュするようです。

投稿の下部にあるスクリーンショットを参照してください。

EDIT:私は最後のforループを削除すると、プログラムが正常に終了しているようです。だから私はそれがバッファーサイズに関連していると仮定します。

EDIT 2:これは何も変わっていない

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

:私はへmallocラインを変更しました。プログラムはまだクラッシュします。

EDIT 3

enter image description here

+0

コードの最初の行を見ると、 'wchar_t DirToEmpty'は' wchar_t * DirToEmpty'ですか? –

+1

実際に*実際のコード*を投稿する必要があります。 –

+0

おそらくあなたの問題とは無関係です: 'wchar_t'や' wcslen() 'のようなものをハードコーディングするなら、' TEXT() 'マクロを使うべきではありません。代わりに' L '\\' 'を実行してください。 –

答えて

2

malloc関数パラメータの必要な倍増に加えて、そのループのバグの束があり、私の

  • 一貫性のない使用及びjを送信元および宛先インデックスとして使用
  • 間違ったループ条件
  • S + =
  • \余分を追加すると、ここで0ターミネータ

を追加する必要があるときに、私を高めるために忘れpuriousはそれを修正する私の試みです:

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 + 1)ではなく、DirToEmpty [i]を使用する必要があります。

関連する問題