我应该从以下代码中得到什么

时间:2013-02-02 02:11:26

标签: c

我正在学习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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

g是指向double的指针。 h是一个10 doubles的数组。因此,您应该期望sizeof(h)sizeof(g)获得不同的结果。看起来您的系统是64位(指针长度为8字节)。

顺便说一句,sizeof返回size_t类型的值,该值与int不同,可能与unsigned int不同,因此您应该使用相应的类型说明符,%zu,而不是%d%u

答案 2 :(得分:2)

对于在当前作用域中定义的静态数组,sizeof返回数组占用的内存大小 - 即number_of_elements * sizeof(element)(但如果将静态数组传递给函数,它会自动转换为一个指针)。另一方面,对于动态数组(即指针),它总是返回指针的大小。

答案 3 :(得分:0)

double *g :: g 是一个指针,表示它将存储地址。要存储地址, g 需要8 Bytes (64-Bit)。所以sizeof(g) = 8 Bytes。即使您在 g 需要存储的所有情况下声明sizeof(g)char *g cuz,float *g也会产生相同的结果地址。

另一方面,double h[](包含10个元素)需要8 (sizeof(double)) * 10 (Num_Of_Elements),即sizeof(h) = 80 Bytes