ある数字未満の数字を重複なし,順番ランダムで
配列に代入するプログラムを作成しました。
いろいろ実験しながら作ったので無駄な部分は多いのですが、、、
shuffle関数にて動的に配列を作っています。
動的に配列を作った場合はfreeで解放してあげる必要があると
様々なサイトで書かれていたことを頭のすみに入れながらプログラムを作ったらたくさんの疑問が生まれました
質問1 arrayに動的に作った配列array2のアドレスを格納し,freeしてみました。
僕としては動的に作った配列はfreeしないといけない意識があり,shuffle関数内でfreeしたかったのですが戻り値として設定したかったこともありshuffle関数内でのfreeをあきらめて同じポインタを持つarrrayをfreeした次第です。
しかし,freeの前後でarrayのアドレスは変わっていませんでした。何故でしょうか。
質問2 printf("%p",array[1]);でarray[1]のアドレス,すなわちarray[0]+1がアドレス表示されると思ったのですが格納された値が出力されました。何故でしょうか。
質問3 shafful関数でarray2をfreeした状態で戻り値にarray2を指定するとarray[2]以降はarray2の同じ要素が格納されています。freeしたから確保したアドレスはなくなり,array2が保持していた情報はなくなりエラーになるとおもったのですが
質問4int N ,B からarrayのアドレスまで大きく異なります。これはなぜでしょうか。
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
int* shuffle(int N);
int main(){
srand((int)time(NULL));
int N = 10;
int B = 11;
int *array = shuffle(N);
for(int i = 0; i < N;i++){
printf("N [%d] %d\n",i,array[i]);
}
printf("adress %p\n",array);
free(array);
printf("address %p\n",N);
printf("address %p\n",B);
printf("address %p\n",array);
}
int* shuffle(int N){
int * array2 = (malloc)(sizeof(int)*N);
for(int i = 0; i < N ; i++){
int random = rand()%N;
if( i == 0){ array2[i] = random; printf("array[0] %d\n",random); } else{ int count = 0; for(int j = 0; j < i ; j ++){ //printf("random %d i %d\n",random,i); if( array2 [j] == random){ count = count + 1; i = i - 1; } else if( j == i - 1 && count == 0){ array2[i] = random; printf("array[%d] %d\n",i,array2[i]); } }
}
}
// free(array2);
//printf("address %p\n",array2);
return array2;
}