2

次のコードを実行すると:

int main()
{
    char **temp;
    printf("Size of **temp %d", sizeof(**temp));
    printf("Size of *temp %d", sizeof(*temp));
    printf("Size of temp %d", sizeof(temp));
    return 0;
}

私は得る:

Size of **temp 1
Size of *temp 8
Size of temp 8

私が理解していないのは、charポインターのサイズがどのようになっているの8ですか? マシン独立ですか?

4

7 に答える 7

6

sizeof char ** ポインタはマシンのアーキテクチャに依存します

マシンに依存するだけでなく、コンパイラに依存します。常に同じであると信頼できる唯一のサイズは ですsizeof(char) == 1

于 2012-04-10T18:13:14.497 に答える
5

元の質問では、あなたは電話していませんでしsizeofた。
ダスクワフがあなたのためにそれを修正しました。

生成された出力は次のとおりです。

Size of **temp 1
Size of  *temp 8
Size of   temp 8

理由:

64 ビット アーキテクチャでは、ポインターは 8 バイトです (ポインターが何を指すかに関係なく)。

 **temp is of type char ==> 1 byte
  *temp is of type pointer-to-char ==> 8 bytes
   temp is of type pointer-to-pointer-to-char ==> 8 bytes
于 2012-04-10T18:14:20.743 に答える
1

sizeof 演算子は、コンパイル時にコンパイラによって解決されます。実行時に実際の参照は発生しません。size of 演算子で返されるのは型のサイズです。それで

sizeof(*(char *)0) is 1

ターゲット プラットフォームに 64 ビット ポインターがある場合、sizeof(temp) は 8 になります。ターゲット プラットフォームに 128 ビット ポインターがある場合、sizeof(temp) は 16 になります。

「ターゲット」は、クロスコンパイルできるため、コンパイルするプラットフォームを意味するものではありません。

于 2012-04-10T20:24:29.093 に答える
1

ポインタのサイズはマシンに依存します。

私が理解していないのは、char ポインターのサイズが 8 である方法です。

char ポインター、つまりchar*変数のサイズはシステム上で 8 です。あなたのコードsizeof(*temp)では、char ポインタのサイズが与えられ、それは 8 です。理由sizeof(**temp)は 1 であり**tempchar定義sizeof(char)により 1 です。

于 2012-04-10T18:26:37.220 に答える
0
Size of **temp 1
Size of *temp 8
Size of temp 8

正解を示しています。なんで?

Because
Size of **temp 1--->> pointing to char.
Size of *temp 8----->>pointing pointer to char.
Size of temp 8---->>>>pointing pointer to pointer to char.

このコードを 32 ビット コンパイラで実行する場合、64 ビット コンパイラを使用しています。

Size of **temp 1
Size of *temp 4
Size of temp 4
于 2013-06-09T16:01:03.843 に答える