-2

関数にポインター引数を渡していますが、呼び出し元のポインター値と呼び出された関数が異なります。アイデアを与えるために、私は自分の作業コードに似たコードを書いています-

void free_wrapper (char* a) {
printf ("a - %p \n", a);
free (a);
}

main () {
char a [200];
char * c = malloc (sizeof (char)*100); //some 100 bytes;

memset (a, 50, 200);
a [199]  = '\0';

/* here I write some data into the alloc'ed memory */
/* instead of writing 100 bytes I go and write beyond the boundaries */;

strcpy (c, a); //explicit use of strcpy
printf ("c - %p \n", c);
free_wrapper (c);

return 0;
}

割り当てられたメモリを破損すると、free_wrapperの前のprintfとfree_wrapperのprintfがポインタに異なる値を出力していることがわかります。

ここで紹介したコードでは問題が発生しない可能性がありますが、作業コードで頻繁に発生します。誰かがスタックの引数として渡された値が破損するさまざまなシナリオのアイデアを私に与えることができますか?

タイプミスで申し訳ありませんが、質問は修正されました。

4

4 に答える 4

1

free_wrapper の前の printf と free_wrapper の printf が、ポインターに対して異なる値を出力していることがわかります。

に渡しますafree_wrapper、その前に書きcますa。それは、それらが異なるからです。

于 2012-09-10T16:38:22.890 に答える
1

コードには 2 つの問題があります。

  1. 解放する必要のないものを解放しています。配列aを free_wrapper 関数に渡しています。これは違法です。呼び出したものだけを解放できますmalloc。したがって、解放するのはcです。

  2. 200 バイトの bufferを 100 バイトのbuffer にcコピーしているため、バッファの末尾を大量に上書きしています。これにより、メモリが破損します。少なくともと同じ大きさにします。acca

char * strcpy ( char * destination, const char * source );宛先は、常にソース バッファーより大きくする必要があります。またstrcpy_s、宛先配列のサイズを確認するバージョンを使用します。

于 2012-09-10T16:46:25.187 に答える
0

もちろん、それらは異なる値を出力します。それら異なる値です。aはスタックに割り当てられた配列でありc、ヒープから動的に割り当てられます。(aこれはあなたが渡しているものですfree_wrapper)。

于 2012-09-10T16:36:51.407 に答える
0

2 つの異なる値を出力していることに気付かなかったかどうかはわかりませんが、それが結果が異なる理由です。

printf ("c - %p \n", c); 
free_wrapper (a);    //This will call a printf of a
                     // a's memory location != c's memory location

または、strcpy がどのように機能するかについて混乱している場合。strcpyは文字列の内容をコピーするだけで、ポインターを同じものにすることはありません。

于 2012-09-10T16:47:20.997 に答える