C言語のmallocとfree関数について

投稿者:

 

いかつい題名になってしまったけど、そんな大した内容ではないです。

 

c言語のmallocを、同じポインタ変数に動的に確保した領域を解放せずに、
もう一度mallocしたらどうなるんだろうと思って実験したのでその記録です。

 

・以下使ったコード

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

int main(){
    int *num1, *num2;

    num1 = (int *)malloc(sizeof(int));
    *num1 = 1;
    printf("num1(%p) = %d\n", num1, *num1);

    num2 = num1;
    //free(num1);
    num1 = (int *)malloc(sizeof(int));
    *num1 = 2;

    printf("num2(%p) = %d, num1(%p) = %d\n", num2, *num2, num1 ,*num1);
   

    return 0;
}

 

まず、int型のポインタ変数を二つ用意して、num1を動的に確保したメモリのアドレスを代入します。

確保先に1を代入して、アドレスをnum2にコピーしときます。

そして、num1を再びmallocにてアドレスを代入します。

そして、次は確保先に2を代入します。

 

このときの、出力は以下になりました。

 

num1(0x5601c5c0d260) = 1
num2(0x5601c5c0d260) = 1, num1(0x5601c5c0d290) = 2

 

まぁ、予想通りの結果でした。

動的に確保したメモリは解放し忘れないようにしようと思いましたね。

 

話は少し変わりますが、上のコードのコメントアウトを外して実行すると、初めに確保した領域を一旦解放してから、新たに領域を確保します。

この時、num2が示しているアドレス先は空になるので、出力の際にsegmentation faultになるかなっと思ってたんですが、

 

結果は以下の通りで

num1(0x559cc06eb260) = 1
num2(0x559cc06eb260) = 2, num1(0x559cc06eb260) = 2

 

num1num2が示しているアドレスが同じになりました。

解放したところを再び、動的に確保したおかげでたまたまsegmentation faultにならなかったみたいです。

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください