いかつい題名になってしまったけど、そんな大した内容ではないです。
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
num1
、num2
が示しているアドレスが同じになりました。
解放したところを再び、動的に確保したおかげでたまたまsegmentation fault
にならなかったみたいです。