1

問題を投稿して、ここで回答を得ました。これが私がVC2010でデバッグしたコードです。最後に表示される実行時エラーが発生します。sdirの使用の何が問題になっています か?

#include<iostream>
#include<stdlib.h>

#include<windows.h>
void make_dir(int depth, char *dir) {
  if (depth < 3) {

    CreateDirectoryA (dir,NULL); 

    for (int i = 0; i < 10; i++) {
       char *sdir= (char*)malloc(strlen(dir+10)); // XXX 10?
        strcpy(sdir, dir);
        sprintf(sdir + strlen(sdir), "\\%d", i); 
        printf("%s\n", sdir);
        CreateDirectoryA(sdir,NULL);
        make_dir(depth + 1, sdir);
        free(sdir);
    }   
  }     
}

int  main()
{
    make_dir(0,"dir");
    return 1;
}

エラーは次のとおりです。

HEAP [mkdir.exe]:00411514で変更された004114E8のヒープブロックが、要求されたサイズの24を超えたため、mkdir.exeでブレークポイントがトリガーされました。

これは、ヒープの破損が原因である可能性があります。これは、mkdir.exeまたはロードされたDLLのいずれかにバグがあることを示しています。

これは、mkdir.exeにフォーカスがあるときにユーザーがF12キーを押したことが原因である可能性もあります。

出力ウィンドウには、より多くの診断情報が表示される場合があります。プログラム'[3008]mkdir.exe:Native'がコード0(0x0)で終了しました。

4

2 に答える 2

6

私が見る最も明白なエラーは、渡されるポインターに10を追加していることですstrlen。これにより、文字列の長さが10文字未満の場合は文字列の外部のメモリが読み取られ、それ以外の場合は文字列の長さから10が減算されます。おそらく、入力ではなく、の結果に10を追加する必要があります。strlen

つまり、)+10から前に移動し+10ます。

于 2012-03-03T07:03:28.220 に答える
2

この行:

char *sdir= (char*)malloc(strlen(dir+10));

これは文字列dirを取得し、長さを取得する前に10文字オフセットします。あなたが意味しないのは確かですか:

char *sdir= (char*)malloc(strlen(dir)+10);

'\0'また、終了キャラクターの余地もありますか?

于 2012-03-03T07:06:06.233 に答える