如果我在malloc((中将大小加倍,内存分配是多少?
struct node{
int data;
struct node*next;
};
void main(){
//What if I place 2,3 or 4 times the size.What is the memory allocation looks like.What if I do something like 1.5 times or say 1.3 times
struct node* a =(struct node *)malloc(2*sizeof(struct node));
//Moreover if I print this I get 8,if I am saying twice size,shouldn't I get 16 size(two nodes with 8 bytes each(4 byte of data and 4 byte of next))
printf("%d",sizeof(*a));
}
即使您的问题不清楚,我认为您对sizeof()
运算符感到困惑,它不会为您提供对象的分配大小,而是给出其类型的大小,对于数组,因为它们是数组类型,它们的大小将是数组的大小(以字节为单位(。
这是标准草案中的引用
6.5.3.4
sizeof
和_Alignof
运算符
sizeof
运算符产生其操作数的大小(以字节为单位(,可以是 表达式或类型的括号名称。大小由类型确定 操作数。结果是一个整数。如果操作数的类型是可变长度数组类型,则计算操作数;否则,不计算操作数,结果为整数常量。_Alignof
运算符产生其操作数类型的对齐要求。这 不计算操作数,结果为整数常量。应用于数组时 类型,结果是元素类型的对齐要求。- 当
sizeof
应用于类型为char
、unsigned char
或signed char
(或其限定版本(的结果为 1。当应用于 具有数组类型的操作数,结果是数组中的总字节数。103(当应用于具有结构或联合类型的操作数时,结果是此类对象中的总字节数,包括内部填充和尾随填充。
另外,如果您使用的是 c,请不要将void *
转换为其他指针类型,这是不必要的,如果是 c++,则使用 new
而不是 malloc()
。
该行
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(。
当你说malloc(2*sizeof(struct node))
时,你正在分配一个内存块,它可以存储两个struct node
,彼此相邻。如果你说 3 或 4,等等,那就是在这个更大的分配中你可以把多少个struct node
放在一起。
如果你说malloc(1.5*sizeof(struct node))
这样的话,那么你应该得到一个编译器警告或错误,关于将double
传递给需要int
的函数(malloc
(,因为1.5*sizeof(struct node)
1.5
乘以一个整数,这是一个双精度。
sizeof(*a)
实际上不取决于您的malloc
调用,而仅取决于struct node
的单个实例在内存中的大小。此大小由结构中的实际字段以及 C 编译器实现所需的任何填充或额外字节组成。
sizeof *a
不会改变 - 这是您取消引用a
时得到的元素的大小。 既然*a
是struct node
,那么sizeof *a
==sizeof (struct node)
。
顺便说一句,不要投下malloc()
的结果 - 相反,#include <stdlib.h>
.
在任何事情之前:
-
main()
应该返回int
,而不是void
。 - 不要投射
malloc()
的结果。 - 请缩进您的代码以提高可读性。
- size_t的格式说明符是
%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 node
的指针,所以*a
是一个struct node
,这就是你要测量的。如果要跟踪动态分配的数组的长度,则需要手动完成。
*除非其操作数是 VLA。但是没有人喜欢VLA。