我正在学习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的双数组,并且由于每个双精度数为8个字节,sizeof(g)
和sizeof(h)
应该等于80 。
但是,我收到以下回复:
Size of g: 8
Size of h: 80
我缺少什么,为什么sizeof(g)
8在这里?
答案 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
。