我对sizeof
函数返回的内容感到困惑。
假设我在sizeof
的程序中输入以下内容,这就是返回的内容:
sizeof(char) == 1
sizeof(int) == 4
sizeof(float) == 4
sizeof(long) == 8
sizeof(double) == 8
sizeof(void *) == 8
sizeof Pointer
是8
所以如果我malloc
长数组:
long *array = (long *)malloc(64)
这个sizeof()
插入我的长数组的malloc
是否相同?
long *array = (long *)malloc(8*sizeof(long))
现在,如果我有一个结构:
typedef struct treenode {
struct treenode *left;
struct treenode *right;
void *content;
} Treenode;
我运行sizeof(Treenode)
,我是否一起添加结构的所有元素?
指针+指针+ void * = 8 + 8 + 8 = 24
我尝试在程序中运行它,但是我得sizeof(Treenode)
返回12。
我也想知道为什么当我创建一个这样的新结构时:
typedef struct country {
char city[40];
int population;
int rank;
}
并尝试malloc(sizeof(country *))
仅分配8个字节而不是结构的字节。
最后当我sizeof("Korea")
时,为什么我的返回值为6而不是5?它不应该是5因为字符串中只有5个字符吗?
答案 0 :(得分:2)
我将分别处理每个问题:
这些在您描述的上下文中是等效的
long *array = (long *)malloc(64)
long *array = (long *)malloc(8*sizeof(long))
但是,这在所有机器上都不一定正确(如果在一台机器上长一个是16字节),因此这段代码不可移植。你应该只使用第二种可移植的方法。
我不确定为什么这个尺寸声称是12 - 抱歉。 (你确定所有指针的大小是8?)
country
结构可能非常大,但指向country
的指针只是一个指针,因此它的大小就在你的情况下8。答案 1 :(得分:1)
如果sizeof(Treenode)
为12,那么您不使用64位指针/内存。如果你在其他地方得到不同的结果(sizeof(void *) == 8
),那么你必须有不同的目标。
sizeof(country *)
是指向country
的指针的大小,即 - 与任何其他指针相同。请改用malloc(sizeof(country))
。
sizeof("Korea")
包含字符串空终止符的大小。
答案 2 :(得分:0)
您使用的是哪种架构都很重要 在32位上,每个指针大小为4个字节 在64位上,每个指针大小为8个字节。
因此,如果您运行以下代码:
long *array = (long *)malloc(64) ;
和以下代码:
long *array = (long *)malloc(8*sizeof(long))
它在64位上是相同的,但不是在32位中。
malloc(sizeof(country *))
只分配8个字节,因为(country *)
是指针的类型(指向国家结构的指针),每个指针在64位中长8个字节。