C言語 strlen() vs sizeof():違いと正しい使い分け
strlen()とは
C言語において、strlen()はヌル終端文字列の文字数を、終端の'\0'を除いて返します。英数字、記号、スペースすべてをカウントします。
本記事ではstrlen()、sizeof()の役割と、それらがなぜ異なる振る舞いをするのかを解説します。
strlen()の定義sizeof()の定義- 構文例
- 主な違い
sizeof()とは
sizeof演算子は、オペランドのサイズをバイト単位で返します。静的な型に対してはコンパイル時に、可変長配列に対しては実行時に評価されます。プリミティブ型、ポインタ、構造体、共用体など、Cのすべてのデータ型に適用可能です。結果の型はsize_tで、最大オブジェクトのサイズを保持できる符号なし整数型です。
intやdoubleのサイズは32ビット/64ビットシステムで異なるため、sizeofを使うことで移植性が確保されます。
主な違い
strlen()は文字列の文字数を測定、sizeof()は変数や型が占めるメモリサイズを測定strlen()のみが終端ヌル文字'\0'を考慮、sizeof()は内容を無視- 両者の戻り値型は
size_t(現代システムでは一般的に64ビット符号なし整数) strlen()はstring.hで定義される実行時関数、sizeofはコンパイル時単項演算子(VLA除く)strlen()は文字配列のみ対象、sizeofはあらゆる型に適用可能
strlen()の構文
size_t length = strlen(my_string);
my_stringは文字配列またはヌル終端文字列へのポインタ。
strlen()の例
#include <stdio.h>
#include <string.h>
int main() {
char strng[] = "January";
printf("Length of given string is: %zu\n", strlen(strng));
return 0;
}
出力:
Length of given string is: 7
sizeof()の構文
1) sizeof(型)
sizeof(type)は指定型のサイズを返します。
#include <stdio.h>
#define my_sizeof(type) ((char*)(&type+1) - (char*)&type)
int main() {
double x;
printf("%zu", my_sizeof(x));
return 0;
}
出力:
8
2) sizeof(変数)
変数名を渡してそのメモリフットプリントを取得。
#include <stdio.h>
int main() {
printf("sizeof(char) = %zu\n", sizeof(char));
return 0;
}
出力:
sizeof(char) = 1
3) sizeof(式)
式の型サイズを値を計算せずに評価。
#include <stdio.h>
int main() {
char p = 'S';
double q = 4.65;
printf("Size of variable p : %zu\n", sizeof(p));
printf("Size of an expression : %zu\n", sizeof(p+q));
int a = (int)(p+q);
printf("Size of explicitly converted expression : %zu\n", sizeof(a));
return 0;
}
出力:
Size of variable p : 1 Size of an expression : 8 Size of explicitly converted expression : 4
視覚的比較
以下は両者のサイドバイサイド比較です。
| 機能 | strlen() | sizeof() |
|---|---|---|
| ヘッダファイル | string.h | 不要(組み込み演算子) |
| 目的 | 文字列長を計算(ヌル除く) | 型や変数のメモリサイズを取得 |
| 戻り値型 | size_t | size_t |
| 評価タイミング | 実行時(文字列を走査) | コンパイル時(VLA除く) |
| 適用対象 | 文字配列またはヌル終端文字列ポインタのみ | すべてのデータ型と式 |
使い分けの指針
- 文字列の論理的な長さが必要な場合(バッファ割り当て、部分文字列抽出、入力検証等)は
strlen()を使用 - データ型や変数の物理的サイズが必要な場合(
memcpyでのメモリコピー、構造体配列のメモリ確保等)はsizeof()を使用 sizeof(char)は常に1バイトであり、C言語におけるメモリの基本単位であることを覚えておく- 文字列リテラルでは、
sizeof("hello")は6(5文字+ヌル終端)、strlen("hello")は5になる
これらの指針を守ることで、効率的・移植性・保守性に優れたCコードが書けます。
C言語
- ブレージング vs 半田付け:温度・強度・冶金学的違いを完全解説
- 2ストローク vs 4ストロークエンジン:主な違いを徹底解説
- DCモーターとACモーターの違い:主要な差異と購入ガイド
- アスベスト vs ガラス繊維:主な違い、用途、安全性の考慮点
- C 言語の構造体 vs 共用体: 実践ガイド
- C# vs C++: 機能、パフォーマンス、ユースケースの明確な比較
- C vs C++: 主な違いとそれぞれを選ぶべきケース
- C言語 vs Java:機能、歴史、用途の包括的比較
- Python vs JavaScript:主な違い、特徴、選び方の指針
- Python vs Ruby:特徴、メリット、ユースケースの徹底比較
- Python 2 vs Python 3:主な違いと適切なバージョン選択