0

コードは次のようになります。

char *global1 = NULL;
char *global2 = NULL;
char *global3 = NULL;
char *global4 = NULL;

void func2(char *gPtr, char **gPtrToInitialize)
{
    if(*gPtrToInitialize == NULL)                     // Here, gPtr is correct
    {
        *gPtrToInitialize = dlcalloc(MAX_PATH, 1);      
    }                              // Here, gPtr has trailing junk characters

    // Do some initialization
}

void func1()
{
    if(global1 == NULL)
    {
        global1 = dlcalloc(MAX_PATH, 1);
    }
    func2(global1, &global2);
    func2(global1, &global3);
    func2(global1, &global4);

    // Do other tasks

    // Free all allocated global variables
}

注: 上記のコードでは、DougLeaのmalloc.cdlcallocで定義されているコードを指します。


calloc中の前にfunc2()

gPtr= "C:\ Program Files \ Test \ Path.txt"

calloc中に入った後func2()

gPtr= "C:\ Program Files \Test\Path.txt♂"


私の質問は、連続したdlcalloc()呼び出しは他の変数のメモリを破壊する可能性がわずかにあるかということです。上記のコードは、私が取り組んでいるものの大きなコードベースの一部を一般化したものです。

4

2 に答える 2

1

さて、私はちょうど私の問題を解決しました。これはで起こっていたものでしたfunc2()

  • gPtrを指した0x009b0038
  • strlen("C:\Program Files\Test\Path.txt")=30バイト。
  • *gPtrToInitializeのセクションが終了した直後0x009b0057に開始する、ポイントされた割り当てについて。gPtr
  • が指す文字列にgPtrは末尾の「\0」がないため、の文字列操作はgPtr実際には*gPtrToInitializeのメモリにも入ります。

末尾にを追加するだけで、これはすべて解決されました'\0'

すべての回答をありがとう!

于 2013-02-26T05:49:39.267 に答える
0

dlcallocには、バグがない限り、メモリの他の部分が破損する可能性はありません(可能性は低いです)。動作するか失敗するかのどちらかですが、何も破損しないはずです。

上記のコードでは、global2、global3、およびglobal4のアドレスをfunc2に渡しているため、ポインターの使用法を確認する必要があると思います。これらのアドレスがnullになることはないため、func2でdlcallocが呼び出されることはありません。

func2は次のようになっていると思います。

void func2(char *gPtr, char **gPtrToInitialize)
{
    if(*gPtrToInitialize == NULL)                     // Here, gPtr is correct
    {
        *gPtrToInitialize = dlcalloc(MAX_PATH, 1);      
    }                              // Here, gPtr has trailing junk characters

    // Do some initialization
}

私はあなたのコードの他の場所で、メモリの破損を引き起こす可能性がはるかに高い同様のポインタエラーを探します。

Cポインタは危険です。

于 2013-02-26T05:09:13.820 に答える