C言語で独自のsizeofを実装する方法を解説
C言語のsizeof演算子は、変数やデータ型が占めるバイト数を取得するために使われます。実は、この仕組みはポインタ演算の性質を利用すれば、マクロを使って自分でも再現することができます。この記事では、独自のmy_sizeofマクロを実装する方法を詳しく解説します。
基本的な考え方
まず、変数xのアドレスを&xで取得することを考えてみましょう。ここで&x + 1とすると、ポインタは「1つ先」に進みますが、その進み幅はデータ型によって異なります。
- 1バイトだけ進む →
char型 - 4バイト進む →
int型やfloat型 - 8バイト進む →
double型など
つまり、(&x + 1)と&xの差(アドレスの差分)を計算すれば、変数xのサイズを求めることができるのです。
なぜマクロとchar型キャストを使うのか
この実装では、関数ではなくマクロを使用します。理由は、関数の場合は引数のデータ型を事前に定義する必要がありますが、マクロなら任意の型の変数に対して展開できるためです。
また、アドレスを(char *)にキャストしている点も重要です。char型は常に1バイトであるため、char *同士の差分を取ることで、「その領域に何個の1バイト単位が収まるか」、すなわち正確なバイト数を得ることができます。
実装例
以下のコードは、独自のmy_sizeofマクロを定義し、int・char・double型の変数サイズを出力する例です。
#include <stdio.h>
#define my_sizeof(type) (char *)(&type+1)-(char*)(&type)
main(void) {
int x = 10;
char y = 'f';
double z = 254748.23;
printf("size of x: %d\n", my_sizeof(x));
printf("size of y: %d\n", my_sizeof(y));
printf("size of z: %d\n", my_sizeof(z));
}実行結果
size of x: 4 size of y: 1 size of z: 8
コードのポイントまとめ
(&type+1) - (&type):隣接するメモリ位置の差分からサイズを算出します。(char *)へのキャスト:charは1バイトなので、差分がそのままバイト数になります。- マクロ定義により、どんなデータ型の変数にも対応できます。
このように、ポインタ演算の仕組みを理解すれば、標準ライブラリに頼らずともsizeofと同等の機能を自作できます。C言語におけるメモリとポインタの理解を深める良い練習題材と言えるでしょう。
-
初心者向けガイド:自分だけのYouTubeチャンネルの作り方
ゲーム実況シリーズでインターネットを沸かせたい、あるいは独自のフュージョン料理の腕前をカメラの前に立って世界に発信したい——YouTubeチャンネルを始める理由は数え切れないほどあります。しかし、いざ最初の一歩を踏み出そうとすると、ハードルが高く感じられるものです。幸い、実際に始めてみると想像以上に簡単です。このガイドに従えば、あっという間にチャンネルを立ち上げて運用を開始できます。 YouTubeチャンネルの作成手順 それでは早速始めましょう。自分専用のYouTubeチャンネルは、どのようにして作ればよいのでしょうか? 実は、あなたはすでにYouTubeアカウントを持っている可能性がありま
-
自分だけのQRコードを作る方法!Windows・Android・iPhone別の手順を解説
近年、多くの企業やアプリが集客のためにQRコードを活用しています。QRコードは、詳細な説明を口頭で伝えなくても、情報を簡単に共有できる最も手軽な手段です。カメラ付きスマートフォンがほぼ普及したことで、ここ数年でその人気はさらに高まりました。しかし、「自分でQRコードを作りたいけれど、やり方がわからない」という方もまだ多くいらっしゃいます。この記事では、さまざまなプラットフォームでQRコードを作成する方法をわかりやすくご紹介します。QRコードとは?「QR」は「Quick Response(クイックレスポンス)」の略称です。QRコードは白黒の正方形パターンで構成されたマトリックス型コードで、スマー