19

sizeof(...)私は C コードを持っていますが、関数がどのように機能するかわかりません:

#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 の動作が異なるのはなぜですか?

誰でも明確にできますか?

4

6 に答える 6

26

firstnamechar末尾に- ターミネータがある配列0です。lastnameポインタです。64 ビット システムでは、ポインターは 8 バイト幅です。

于 2013-06-23T11:23:47.783 に答える
6

sizeof配列は配列全体のサイズで、「bobby」の場合は 5 文字で、末尾の 1 文字\0は 6 に相当します。

sizeofa pointer はポインターのサイズで、通常、32 ビット マシンでは 4 バイト、64 ビット マシンでは 8 バイトです。

于 2013-06-23T11:25:05.157 に答える
4

最初の配列のサイズは のサイズですbobby\0\0ターミネータ文字なので 6 です。

2 番目のサイズはポインターのサイズで、64 ビット システムでは 8 バイトです。そのサイズは、割り当てられた文字列の長さに依存しません。

于 2013-06-23T11:24:52.443 に答える
3

firstnameは、文字列の末尾にあるchars終了文字を含む6 の配列です。'\0'だからsizeof firstname6です。

lastnameは へのポインターでcharあり、そのようなポインターがシステム上で持つサイズは何でもあります。典型的な値は 4 と 8 です。 のサイズは、lastnameそれが何を指していても (または何も指していなくても) 同じです。

于 2013-06-23T11:25:25.597 に答える
2

firstname[]長さに 1 が追加されます。

sizeof(lastname)実際の値ではなく、ポインターのサイズを指定しています。

于 2013-06-23T11:25:09.277 に答える