・C言語でも動的配列を使いたい人
・mallocの存在は知ってるけど使い方を忘れた人
向けにmallocの使用方法がわかるように、
intの1次元配列、2次元配列、char型の1次元配列
の3つの使用例をのせました。
なんかコードを置いてありますが、ほとんど意味がないのでハイライトしてあるところだけ見てもらえれば十分だと思います。
int型の1次元配列のmalloc使用例
N個の整数を入力してもらい、1つずつスペースを空けて出力するだけのコードです。
#include <stdio.h>
#include <stdlib.h>//malloc,freeや乱数など色々使える
int main(void){
int N;
printf("入力する整数の個数を指定してください:");
scanf("%d", &N);
//整数型の1次元配列
int *num;
num = (int *)malloc(sizeof(int)*N);//これでメモリ確保
for(int i=0; i<N; i++){
scanf("%d", &num[i]);
}
for(int i=0; i<N; i++){
printf("%d ", num[i]);
}
printf("\n");
free(num);//メモリの解放を忘れずに
return 0;
}
- 10行目のように、先頭となるポインタを指定。
- 11行目のように、int型のサイズのN個分のメモリを確保し、intのポインタ型に明示的にキャストをするような形で書きます。
- freeを使ってメモリの解放をするのを忘れないようにしましょう。
int型の2次元配列のmalloc使用例
#include <stdio.h>
#include <stdlib.h> //mallocとかfreeやrandomなど色々使える
int main(void){
int N, M;
printf("n×mの掛け算の表を用意します。2つの整数をスペースを空けて入力してください:");
scanf("%d %d", &N, &M);
//整数型の2次元配列
int **num_n_m;
num_n_m = (int **)malloc(sizeof(int *)*N);
for(int i=0; i<N; i++){
num_n_m[i] = (int *)malloc(sizeof(int)*M);//N個の各配列がM個の要素を持つイメージ
}
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
num_n_m[i][j] = (i+1)*(j+1);
}
}
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
printf("%3d ", num_n_m[i][j]);
}
printf("\n");
}
free(num_n_m);//メモリの解放を忘れずに
return 0;
}
- int **と宣言することに注意(ポインタのポインタ、2重のポインタみたいになる)
- 1回mallocでN個のポインタの配列を作り、次にfor文で各ポインタをM要素の配列にするように書く。
- 使い終わったら、freeでメモリ解放を忘れない。
char型の1次元配列のmalloc使用例
#include <stdio.h>
#include <stdlib.h> //malloc,freeや乱数など色々使える
int main(void){
int num;
printf("入力する文字数を指定してください:");
scanf("%d", &num);
//文字列が入る配列をつくる
char *str1;
str1 = (char *)malloc(sizeof(char) * (num+1));//これでメモリ確保
if(!str1){//一応エラー処理(str1==\0またはstr1==NULLと書いても同じ)
printf("メモリの確保に失敗しました。\n");
return 1;
}
scanf("%s", str1);//メモリ確保をした分は正常に文字を入れられれます。
printf("入力された文字列は:%s\n", str1);
free(str1);//メモリの解放を忘れずに
return 0;
}
- 文字列は最後にヌル文字\0が格納されるので、
入れたい文字数+1のメモリを確保することに注意。 - 確保できなかったときの処理も追加してみました。
- freeでメモリを解放するのは忘れないように。
他の型についても、型名のところを入れ替えるだけで同様にかけます。
今回の記事でポインタに混乱した人はこちらもどうぞ。