2016-04-25 10 views
1

私は確信していないことが1つありますので、ここで問題は、ここでタイトルがOKであることを願っています。2回要求されたメモリを確認してください

最初に以下のプログラムをチェックしてみましょう:

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

struct person{ 
    char *fn; 
}; 

int main(void){ 
    struct person *pers; 

    pers = malloc(sizeof(struct person)); 
    if(pers == NULL){ 
     printf("No memory Avaible\n"); 
     exit(1); 
    } 

    pers->fn = malloc(10000000000000000); /*requesting a big chunk*/ 
    if(pers->fn == NULL){ 
     printf("No memory Avaible =>> [pers->fn]\n"); 
     free(pers); 
     exit(2); 
    } 


    strcpy(pers->fn, "Michi"); 
    pers->fn[strlen(pers->fn)] = '\0'; 

    printf("FN = %s\n",pers->fn); 

    if(pers->fn){ 
     free(pers->fn); 
    } 

    if(pers){ 
     free(pers); 
    } 
} 

出力は次のようになります。

No memory Avaible =>> [pers->fn] 

使用可能なメモリがありませんので、私はpers、その後exitに自由を実行します。

if(pers->fn == NULL){ 
    printf("No memory Avaible =>> [pers->fn]\n"); 
    free(pers); 
    exit(2); 
} 

ここで、十分なメモリとプログラムはうまく動作します。後者はこの部分です:

if(pers->fn){ 
    free(pers->fn); 
} 

if(pers){ 
    free(pers); 
} 

メモリがまだ存在するかどうかを確認する保証はありますか?あなたがmalloc()経由、またはゼロ値を割り当てられたメモリへの有効なポインタのいずれかでfree()を呼び出すことができます

free(pers->fn); 
free(pers); 
+1

メモリがそこに存在しない唯一の理由は、あなたや他の人があなたのために解放した場合です。あなたが悪い割り当てで終了するとき、値はそこにある必要があります。私は誰かがあなたのためにそれを変更したり解放したりした可能性があるかどうかを確認するだけです。 BTW、 '10000000000000000'はmalloc intをオーバーフローしますが、私はあなたがそれを知っていると確信しています:) –

+0

** malloc()**が成功していない場合、あなたのプログラムは無条件に終了するので、終了時にチェックする必要はありません。他のプログラムは、ロジックの流れが異なり、終了時にチェックが必要な場合があります。 –

+0

@MichaelDorgan私は何とかシミュレートしていました:)) – Michi

答えて

1

: それとも私はちょうど元気です。したがって、ポインタが有効またはNULLの場合は、free()を呼び出す前に確認する必要はありません。

+0

これは私がすでに知っているが、質問は他の何かについてここにある。 @MichaelDorganのコメントを確認してください。 – Michi

1

プログラムのその時点で確認する必要はありません。以前の2つのmalloc()が成功した場合にのみ、そこに着くことができました。

+0

事実に基づいて、mallocは成功しました。そのメモリをもう一度チェックする必要はありません...はい、私はすでに知っていますが、100%確実か安全かを質問しています。それ。 – Michi

+1

100%確実/安全なものはありません。 CPUが壊れてしまったり、RAMやマルウェアがシステム保護を越えてプログラムのメモリ空間に侵入する巧妙な方法が見つかったりする可能性があります。しかし、あなたが共有しているCコードでは、コードが有効で、 'free() 'を呼び出す前に、それ以上のチェックは必要ないことを100%確信しています。 – user590028

+0

私が期待していたこの種の回答です。 – Michi

関連する問題