私は確信していないことが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);
メモリがそこに存在しない唯一の理由は、あなたや他の人があなたのために解放した場合です。あなたが悪い割り当てで終了するとき、値はそこにある必要があります。私は誰かがあなたのためにそれを変更したり解放したりした可能性があるかどうかを確認するだけです。 BTW、 '10000000000000000'はmalloc intをオーバーフローしますが、私はあなたがそれを知っていると確信しています:) –
** malloc()**が成功していない場合、あなたのプログラムは無条件に終了するので、終了時にチェックする必要はありません。他のプログラムは、ロジックの流れが異なり、終了時にチェックが必要な場合があります。 –
@MichaelDorgan私は何とかシミュレートしていました:)) – Michi