C言語のcalloc()とmalloc()の違いを徹底解説!動的メモリ確保の基本
calloc()関数とは
calloc()は「contiguous allocation(連続領域の確保)」を意味する標準ライブラリ関数です。malloc()とよく似た働きをしますが、同じサイズのメモリブロックを複数個まとめて確保できる点が特徴で、さらに確保したメモリ領域をすべて0で初期化してくれる点も大きな違いです。
C言語におけるcalloc()の構文は以下の通りです。
void *calloc(size_t number, size_t size);
引数の意味は次の通りです。
- number − 確保する配列の要素数
- size − 1要素あたりのメモリサイズ(バイト単位)
以下はC言語でのcalloc()の使用例です。
使用例
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4, i, *p, s = 0;
p = (int*) calloc(n, sizeof(int));
if(p == NULL) {
printf("\nError! memory not allocated.");
exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}
printf("\nSum : %d", s);
return 0;
}
実行結果
Enter elements of array : 2 24 35 12 Sum : 73
このプログラムでは、calloc()によってint型4個分のメモリブロックが確保されます。ポインタ変数pがNULLの場合はメモリ確保に失敗しているため、エラーメッセージを表示してプログラムを終了します。NULLでなければ、ユーザーから配列の4つの要素を入力してもらい、それらの合計値を計算して表示します。
p = (int*) calloc(n, sizeof(int));
if(p == NULL) {
printf("\nError! memory not allocated.");
exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}
malloc()関数とは
malloc()は、指定されたバイト数のメモリを確保し、確保した領域の先頭バイトを指すポインタを返す関数です。確保に失敗した場合はNULLポインタを返します。なお、malloc()が確保したメモリは初期化されていないため、使用前に自分で初期化する必要がある点に注意しましょう。
C言語におけるmalloc()の構文は以下の通りです。
pointer_name = (cast-type*) malloc(size);
各項目の意味は次の通りです。
- pointer_name − ポインタに付ける任意の名前
- cast-type − malloc()で確保したメモリをキャストするデータ型
- size − 確保するメモリのサイズ(バイト単位)
以下はC言語でのmalloc()の使用例です。
使用例
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4, i, *p, s = 0;
p = (int*) malloc(n * sizeof(int));
if(p == NULL) {
printf("\nError! memory not allocated.");
exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}
printf("\nSum : %d", s);
return 0;
}
実行結果
Enter elements of array : 32 23 21 8 Sum : 84
このプログラムでは、4つの変数を宣言し、そのうちのポインタ変数*pにmalloc()で確保したメモリのアドレスを格納しています。ユーザーが入力した配列の各要素を読み込み、その合計値を出力します。
int n = 4, i, *p, s = 0;
p = (int*) malloc(n * sizeof(int));
if(p == NULL) {
printf("\nError! memory not allocated.");
exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}
printf("\nSum : %d", s);
calloc()とmalloc()の主な違い
- 引数の数:malloc()は確保する合計サイズを1つの引数で指定しますが、calloc()は「要素数」と「1要素あたりのサイズ」の2つの引数を受け取ります。
- 初期化:malloc()が確保するメモリは未初期化(不定値)ですが、calloc()は確保したメモリをすべて0で初期化します。
- 処理速度:calloc()は初期化処理を行うぶん、大きな領域を確保する際にはmalloc()よりわずかに時間がかかる場合があります。
用途に応じて両者を使い分けることで、安全で効率的な動的メモリ管理が可能になります。
-
FirefoxとChrome徹底比較:設定・同期・速度の違い
ブラウザを仕事でも趣味でも使うなら、速度・信頼性・設定・機能は欠かせない要素です。FirefoxとChromeはどちらも人気の高いブラウザで、それぞれに魅力があります。では、この2つのあいだに「ベストな選択」は存在するのでしょうか?本記事では、いくつかの違いをわかりやすく解説します。 ブラウザの設定 ブラウザ設定は、セットアップから日常的な操作まで、ブラウザのポテンシャルを最大限に引き出すための基本となるオプションです。設定項目の数、アクセスのしやすさ、そして各項目をどこまで細かくカスタマイズできるかは重要なポイントです。より快適なブラウジング体験のためには、豊富で柔軟な設定があったほうがよい
-
HERE Maps vs Microsoft Maps vs Windows Maps――Windows Phone向けオフラインナビ3種を徹底比較
Windows Phoneで使えるオフラインナビゲーションアプリは、大きく分けて「HERE Maps」「Microsoft Maps」「Windows Maps」の3つです。本記事では、それぞれの長所と短所を比較し、どれが実用に耐えるのかを検証します。HERE MapsはWindows Phone 10(WP10)では提供が終了し、WP8でも更新が停止。今後はMicrosoft MapsかWindows Mapsを使うしかありません。では、なぜ私がこのテーマにこだわるのか?答えは簡単。私はスマートフォン嫌いのLinuxユーザーでありながら、Windows Phoneだけは愛用しているからです。