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()中的大小增加一倍,内存分配是多少

当您说
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;