-1

以下のプログラムでは、私の知る限り、メモリを割り当てた後、アドレスをから変更している場合は 、 ieを使用しptr to ptr++て呼び出しfreeています。その後、プログラムがクラッシュするはずです。しかし、このプログラムでは問題なく動作します。使い方?WindowsXPでCode::Bocksを使用しています。私を助けてください。ptrfree(ptr)

int main()
{
    int *ptr;
    ptr = malloc(1);
    *ptr = 6;
    printf("The value at *ptr = %d \n", *ptr);
    ptr++;      //Now ptr is address has been changed
    free(ptr); // Program should crash here
    ptr = NULL;
    /* *ptr = 5;*/ // This statement is crashing
    return 0;
}
4

4 に答える 4

4

このプログラムの動作は、1バイトを指すことで値を格納した瞬間から定義されていません。int*クラッシュの保証はありません。

具体的にはfree、引数を適切にチェックしていない(おそらくチェックできない)ようです。mallocデバッグライブラリを使用してこのプログラムを実行してみてください。

于 2012-05-07T08:47:36.613 に答える
3

クラッシュがないからといって、必ずしもコードに問題がないわけではありません。別のプラットフォームでは、おそらくクラッシュします。ところで:あなたはむしろmalloc(sizeof(int))するべきです

于 2012-05-07T08:46:54.303 に答える
1

プログラムは必ずしもクラッシュする必要はありません。動作は未定義です。

于 2012-05-07T08:47:28.000 に答える
0

それは運のためだけに機能します。コードはまだ間違っています。

その理由を理解するには、まず、mallocライブラリ自体の実装に精通している必要があります。mallocは、返されたスペースを使用できるように割り当てるだけでなく、ヒープの管理に使用する独自のメタデータ(mallocによって管理されるメモリの領域と呼びます)にもスペースを割り当てます。ptrを変更し、間違った値をfreeに渡すと、メタデータはfreeが期待していた場所ではなくなります。そのため、現在使用しているデータは本質的にガベージであり、ヒープが破損しています。

これは、必ずしもセグメンテーション違反が原因でクラッシュすることを意味するわけではありません。これは、必ずしも不正なポインタを逆参照するわけではないためです。バグはまだ存在しており、ヒープの使用量が多い長いプログラムで明らかになる可能性があります。

于 2012-05-07T08:51:31.107 に答える