0

printf()持った後にしようとするとクラッシュするのはなぜfree()ですか?

動的配列を作成しました。表示された要素。各要素に値を入力します。次に、を使用してメモリを解放しfree()ました。そして、要素を再度表示しようとしています。

コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    int *p;

    p = (int *)malloc(10 * sizeof(int));

    for ( i = 0; i < 10; i++ )
        printf("%d  ", p[i]);
    printf("\n");

    for ( i = 0; i < 10; i++ )
        p[i] = i;

    for ( i = 0; i < 10; i++ )
        printf("%d ", p[i]);
    printf("\n");


    free(p);
    p = NULL;

    for ( i = 0; i < 10; i++ )  /* App crashes around here. */
        printf("%d ", p[i]);
    printf("\n");

    return 0;
}

PS私はCが初めてです。

何が悪いのか教えてください。

4

3 に答える 3

4

を指すメモリを参照するためですNULL

これは実際には未定義の動作であるため、動作する可能NULL性がありますが、ポインターを逆参照するとクラッシュする可能性が高くなります。


ポインターを設定しなくても、NULL割り当てられていないメモリを逆参照する未定義の動作であり、おそらくクラッシュすることはありませんが、それでも悪いことです。

于 2013-04-10T10:14:40.460 に答える
2

あなたfreeの記憶がなくなったとき。これ以上使用することはできません。

あなたはfreeそれを終えた後にすべきです。

ポインタpを解放した後で使用しています。システムは、メモリを解放すると、そのメモリは不要であると見なします。したがって、それはあなたのために予約されません。メモリがまだ使用されていない場合は、何度か機能する場合があります。しかし、この場合NULL、ポインターに割り当ててから、pそこにある値を出力しようとしていますが、これは間違いなく機能しません。

于 2013-04-10T10:15:42.910 に答える