1

私はCを学んでいて、次のコードを書きました。

#include<stdio.h>
#include <stdlib.h>

void main(){

double *g = calloc(10, sizeof(double));
double h[] = {1,2,3,4,5,6,7,8,9,10};

printf("Size of g: %d\n", sizeof(g));
printf("Size of h: %d\n", sizeof(h));
}

gとは両方ともh長さ10のdouble配列であり、各doubleは8バイトでsizeof(g)あり、80に等しいはずなので、私は印象を受けています。sizeof(h)ただし、次の応答があります。

Size of g: 8
Size of h: 80

私が欠けているものと、なぜsizeof(g)ここに8があるのですか?

4

4 に答える 4

4

gはdoubleへのポインタです。64ビットコードでは、ポインタの長さは8バイトです。hは10倍の配列であるため、hのサイズは10*8バイトです。

于 2013-02-02T02:16:13.043 に答える
3

gへのポインタdoubleです。h10の配列ですdoubles。したがって、ととは異なる結果を期待する必要がsizeof(h)ありsizeof(g)ます。システムが64ビットのようです(ポインタの長さは8バイトです)。

ところで、sizeofタイプの値を返しますsize_t。これは、とは異なりint、おそらく異なるunsigned intため、適切なタイプ指定子、、%zuではなく、を使用する必要があり%dます%u

于 2013-02-02T02:14:35.663 に答える
2

現在のスコープで定義されている静的配列の場合sizeof、配列が占有するメモリのサイズを返します。つまりnumber_of_elements * sizeof(element)、静的配列を関数に渡すと、自動的にポインタに変換されます。一方、動的配列(つまり、ポインター)の場合、常にポインターのサイズを返します。

于 2013-02-02T02:14:20.367 に答える
0

double *g:: gはアドレスを格納することを意味するポインタです。アドレスを格納するには、gが必要8 Bytes (64-Bit)です。だからsizeof(g) = 8 Bytesgがアドレスを格納する必要があるすべてのケースで宣言またはcuz しても、同じ結果sizeof(g)が得られます。char *gfloat *g

一方、double h[](10 個の要素がある) には8 (sizeof(double)) * 10 (Num_Of_Elements)ieが必要sizeof(h) = 80 Bytesです。

于 2013-02-02T11:02:30.020 に答える