c - malloc() 中的双倍大小

  • 本文关键字:malloc malloc
  • 更新时间 :
  • 英文 :


如果我在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运算符

  1. sizeof运算符产生其操作数的大小(以字节为单位(,可以是 表达式或类型的括号名称。大小由类型确定 操作数。结果是一个整数。如果操作数的类型是可变长度数组类型,则计算操作数;否则,不计算操作数,结果为整数常量。
  2. _Alignof运算符产生其操作数类型的对齐要求。这 不计算操作数,结果为整数常量。应用于数组时 类型,结果是元素类型的对齐要求。
  3. sizeof应用于类型为 charunsigned charsigned 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时得到的元素的大小。 既然*astruct 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。

相关内容

  • 没有找到相关文章

最新更新