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));
}

我的印象是gh都是长度为 10 的双精度数组,因为每个双精度都是 8 个字节,sizeof(g)应该sizeof(h)等于 80。但是,我得到以下响应:

Size of g: 8
Size of h: 80

我错过了什么,为什么sizeof(g)8 在这里?

4

4 回答 4

4

g 是指向双精度的指针。在 64 位代码中,指针的长度为 8 个字节。h 是 10 个双精度数组,因此 h 的大小为 10 * 8 字节。

于 2013-02-02T02:16:13.043 回答
3

g是指向 a 的指针doubleh是 10 的数组doublessizeof(h)因此,您应该期待和的不同结果sizeof(g)。看起来您的系统是 64 位的(指针长度为 8 字节)。

顺便说一句,sizeof返回一个 type 的值size_t,它不同于int并且可能不同于unsigned int,因此您应该为它使用适当的类型说明符,%zu, not %dor %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 Bytes。即使您在所有情况下声明或因为g需要存储地址,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 回答