演習課題「malloc でデータ領域を確保しよう」
右のコードエリアには、入力された大きさのデータ領域を確保し、配列のように使って、値を出力するコードがあります。
このプログラムは未完成です。該当する部分にコードを追加してください。
プログラムを実行して、正しく表示されれば、演習課題クリアです!
期待する出力値
p[0] : 10
p[1] : 20
p[2] : 30
p[3] : 40
p[4] : 50
p[5] : 60
#08:malloc について理解しよう
ポインタの応用として、動的に領域を確保する malloc について学習します。
配列を宣言するには、たとえば、次のような方法があります。#include <stdio.h>
#define N 5
int main(void)
{
int a[] = {1, 2, 3, 4, 5};
int b[5];
int c[N];
}
・a 配列は、各要素を指定して初期化しています。
・b 配列は、要素数を指定して宣言しています。
・c 配列は、要素数を define マクロで指定して宣言しています。
どの方法でも、プログラムが実行される前に配列の大きさが定まっていて、
プログラム実行時に配列の大きさを変更することができません。
標準入力から整数値を受け取るには、fgets と sscanf を使い、変換指定子に %d を用います。#include <stdio.h>
int main(void)
{
int n;
char buf[100];
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &n);
printf("入力された値 : %d\n", n);
}
malloc を使うと、プログラム実行時に領域を確保することができます。#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n;
// n を入力として受け取る処理
...
int *p;
p = malloc(sizeof(int) * n);
}
・領域の大きさは、「sizeof(型名) * 要素数」 で指定します。
・malloc で返される値は、確保された領域の先頭のアドレスです。
(ただし、領域の確保に失敗したときには NULL が返されます)
※より厳密なプログラムを作成するときは、malloc で返された値が NULL であるかどうかを判定する必要があります。#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n;
// n を入力として受け取る処理
...
int *p;
p = malloc(sizeof(int) * n);
if(p == NULL) {
printf("領域の確保に失敗しました");
exit(EXIT_FAILURE);
}
// p を使った処理
...
}
malloc で確保された領域は、free で解放することができます。#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n;
// n を入力として受け取る処理
...
int *p;
p = malloc(sizeof(int) * n);
// p を使った処理
...
free(p);
}
※free によって領域が解放されたあとも、ポインタの値はそのままになります。
そのようなポインタには NULL を代入しておくことが推奨されます。#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n;
// n を入力として受け取る処理
...
int *p;
p = malloc(sizeof(int) * n);
// p を使った処理
...
free(p);
p = NULL;
// p を使った処理など
...
}
このチャプターで作成したコードです。// malloc について理解しよう
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char buf[100];
int n;
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &n);
printf("データの個数 : %d\n", n);
int *p;
p = malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
p[i] = i + 1;
}
for (int i = 0; i < n; i++) {
printf("p[%d] : %d\n", i, p[i]);
}
free(p);
}
- 初心者のためのポイント学習C言語 - malloc
http://www9.plala.or.jp/sgwr-t/lib/malloc.html
- 初心者のためのポイント学習C言語 - free
http://www9.plala.or.jp/sgwr-t/lib/free.html