c言語 malloc関数 動的にメモリ確保する
c言語でメモリを必要な時に必要なだけ確保する
例
#include <stdio.h> //標準入出力関数を使うときに必要なヘッダー
#include <stdlib.h> //malloc関数を使うために必要なヘッダー
int main(void){
int *p; //ポインタp
int n;
printf("サンプル数を入力したください。n = ");
scanf("%d", &n);
p = (int *)malloc(n); //n分のint型サイズでメモリ確保
if(p == NULL){
printf("メモリ確保失敗");
return -1;
}
for(int i = 0; i < n; i++){
p[i] = i; //データの代入
}
for(int i = 0; i < n; i++){
printf("%d\n", p[i]); //データの出力
}
free(p); //メモリ開放
return 0;
}
malloc関数によりメモリの確保が失敗した場合はNULLを返す。 そのため、サンプルプログラムで示した通りif文で判定してあげると状況がわかる。 最後にはfree関数でメモリを解放してあげる。 補足↓
#include <stdio.h> //標準入出力関数を使うときに必要なヘッダー
#include <stdlib.h> //malloc関数を使うために必要なヘッダー
int main(void){
int *p;
p = (int *)malloc(5); //メモリ確保
for(int i = 0; i < 5; i++){
p[i] = i; //順番に数値を代入
}
p = &p[2]; //ポインタpに配列2のアドレスを代入
printf("%d\n", p[-1]);
/*
ポインタpに代入されたアドレスの1つ前のデータを出力
*/
printf("%d\n", *(p-2));
/*
ポインタpに代入されたアドレスから2を引いた。
そして、アドレスに格納されているデータが出力される。
*/
return 0;
}
上のプログラムは代入されたアドレスから相対的に配列を指定して、 データを読みだしている。 ポインタpにp[2]のアドレスを代入した時の関係を下に表として示す。
| p[-2] | p[-1] | p[0] | p[1] | p[2] |
|---|---|---|---|---|
| p-2 | p-1 | p | p+1 | p+2 |
|---|---|---|---|---|
参考
malloc関数Herbert Schildt : “C/C++ Programmer's Reference Second Edition”, Osborne Mcgraw-Hill, p.204, 2000
※間違ってたらすみません。
わかった時点で修正します。
コメント
コメントを投稿