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]
0
1
2
3
4

アドレスの場合

p-2 p-1 p p+1 p+2
0
1
2
3
4

参考

malloc関数
Herbert Schildt : “C/C++ Programmer's Reference Second Edition”, Osborne Mcgraw-Hill, p.204, 2000

※間違ってたらすみません。
わかった時点で修正します。

コメント

このブログの人気の投稿

ダイソー テープライト リモコン付 分解

C++ round関数を使わずに小数第n位の四捨五入をする

C++ cout関数とcin関数を用いた基本的な入出力