malloc()中的两倍大小
如果我将malloc()中的大小增加一倍,内存分配是多少 当您说malloc()中的两倍大小,c,malloc,C,Malloc,如果我将malloc()中的大小增加一倍,内存分配是多少 当您说malloc(2*sizeof(struct node))时,您正在分配一个内存块,可以将两个struct node紧挨着存储。如果你说3,或者4,等等,那就是在这个更大的分配中你可以把多少个struct nodes放在彼此旁边 如果您说类似于malloc(1.5*sizeof(struct node))的话,那么您应该会得到一个编译器警告或错误,关于将double传递给一个需要int的函数(malloc),因为1.5*sizeof
malloc(2*sizeof(struct node))
时,您正在分配一个内存块,可以将两个struct node
紧挨着存储。如果你说3,或者4,等等,那就是在这个更大的分配中你可以把多少个struct node
s放在彼此旁边
如果您说类似于malloc(1.5*sizeof(struct node))
的话,那么您应该会得到一个编译器警告或错误,关于将double
传递给一个需要int
的函数(malloc
),因为1.5*sizeof(struct node)
是1.5
乘以一个整数,即双精度
sizeof(*a)
实际上并不取决于malloc
调用,而只取决于struct节点的单个实例在内存中的大小。此大小由结构中的实际字段以及C编译器实现所需的任何填充或额外字节组成。即使您的问题不清楚,我认为您对sizeof()
运算符感到困惑,它并没有给您对象的分配大小,而是给您对象类型的大小,对于数组,因为它们是数组类型,所以它们的大小将是数组的大小(以字节为单位)
这是对标准草案的引用
6.5.3.4操作员的sizeof
和\u
sizeof
运算符生成其操作数的大小(以字节为单位),该操作数可以是
表达式或类型的括号名称。大小由类型决定
操作数。结果是一个整数。如果操作数的类型是可变长度数组类型,则对操作数求值;否则,不计算操作数,结果为整数常量
\u Alignof
运算符生成其操作数类型的对齐要求。这个
不计算操作数,结果为整数常量。当应用于数组时
类型,则结果是图元类型的对齐要求
将sizeof
应用于类型为char
、无符号char
或
带符号字符
,(或其限定版本)结果为1。当应用于
具有数组类型的操作数,结果是数组中的总字节数。103)当应用于具有结构或联合类型的操作数时,结果是此类对象中的总字节数,包括内部填充和尾部填充
也可以,如果您使用C,不要将代码>空格*/COD>转换为其他指针类型,如果不是C++,则不必使用“<代码>新< /COD> >代替<代码> MalCube()/<代码> < < /P>
线路
node *a = malloc(2 * sizeof(*a));
分配足够的空间来容纳两个类型为node
的对象,因此如果愿意,可以使用带有索引符号的对象
a[0].data = 1;
a[1].data = 2;
但这并不意味着a
是一个数组,这种语法是可能的,因为它等价于使用指针算法
(*(a + 0)).data = 1;
(*(a + 1)).data = 1;
/* incrementa a by 1, and then dereference it -> a[1] */
我想更容易看出a
不是数组
103)当应用于声明具有数组或函数类型的参数时,sizeof运算符会产生调整后(指针)类型的大小(参见6.9.1)。sizeof*a
不会改变-这是解除引用a
时得到的元素的大小。由于*a
是结构节点
,因此sizeof*a
==sizeof(结构节点)
顺便说一句,不要将malloc()
的结果强制转换为-include
:
main()
应该返回int
,而不是void
- 不要强制转换
malloc()
的结果
- 请缩进代码以提高可读性
- 大小的格式说明符是
%zu
,而不是%d
现在,让我们来回答你的问题:
如果我放置2、3或4倍的大小会怎么样?内存分配是什么样子的?如果我做1.5倍或说1.3倍会怎么样
你已经分配了足够的2/3/4的结构,在一个数组中打包。您可以使用数组索引表示法访问它们:
// Accesses the second struct
a[1].data = 47;
此外,如果我打印这个,我得到8,如果我说的是两倍大小,我不应该得到16个大小(两个节点,每个节点有8个字节(4个字节的数据和4个字节的下一个))
sizeof
是一个编译时*运算符。它测量传递给它的类型的大小a
是指向struct节点的指针
,因此*a
是struct节点
,这就是您要测量的。如果要跟踪动态分配的数组的长度,则需要手动完成
*除非其操作数是VLA。但是没有人喜欢VLAs。问题不在于指针的大小(sizeof a
),而在于其引用对象的大小(sizeof*a
)。以上所有内容都是正确的。@TobySpeight感谢您的更正!我真的需要更仔细地阅读问题,“除非”?我不完全理解“除非”:“……除非对象是数组,在这种情况下,它给出数组的大小(以字节为单位)。”使用数组时,sizeof
的行为没有什么异常。它只是以字节为单位给出数组类型的大小,就像它对所有其他类型所做的一样。在这里,数组并不突出。那么,为什么“除非”?@TobySpeight欢迎您编辑我的答案,但是sizeof()
故意用括号,而sizeof(*a)
也故意用括号,因为我喜欢保持一致,当您被迫使用类型名称时,您不能忽略括号。请不要在答案中添加文字或与posrter的意图相冲突的编辑,留下评论来建议如此深刻的更改。为什么我不应该在malloc中添加cast呢。
// Accesses the second struct
a[1].data = 47;