私はCコードを持っていますが、sizeof(...)
関数がどのように機能するか理解できません。
#include <stdio.h>
int main(){
const char firstname[] = "bobby";
const char* lastname = "eraserhead";
printf("%lu\n", sizeof(firstname) + sizeof(lastname));
return 0;
}
上記のコードでは、sizeof(firstname)は6で、sizeof(lastname)は8です。
ただし、bobby
は5文字幅で、eraserhead
は11文字幅です。私が期待する 16
。
文字配列と文字へのポインターでsizeofの動作が異なるのはなぜですか?
誰でも明確にできますか?
firstname
は、末尾の0
- terminatorを保持するchar
配列です。 lastname
はポインターです。 64ビットシステムでは、ポインターは8バイト幅です。
sizeof
配列は、配列全体のサイズです。 "bobby"の場合、5文字と1つの末尾\0
これは6です。
sizeof
ポインターはポインターのサイズで、通常32ビットマシンでは4バイト、64ビットマシンでは8バイトです。
最初の配列のサイズは、bobby\0
のサイズです。 \0
はターミネータ文字であるため、6です。
2番目のサイズはポインターのサイズで、64ビットシステムでは8バイトです。そのサイズは、割り当てられた文字列の長さに依存しません。
_firstname[]
_はヌルで終了し、長さが1増えます。
sizeof(lastname)
は、実際の値の代わりにpointerのサイズを提供しています。
firstname
は、6個のchars
の配列で、終端の'\0'
文字列の末尾の文字。それが理由です sizeof firstname
は6です。
lastname
はchar
へのポインタであり、システム上でそのようなポインタが持つあらゆるサイズを持ちます。典型的な値は4と8です。lastname
のサイズは、それが何を指していようとも(あるいは何も指していなくても)同じです。