【问题标题】:How does dynamically allocating a struct in C work?在 C 中动态分配结构是如何工作的?
【发布时间】:2013-03-17 01:29:44
【问题描述】:

我最近有一个任务,我必须为结构动态分配内存。我用了这个方法:

myStruct *struct1 = malloc(sizeof *struct1);

这工作得很好。但是,我不明白怎么做。我认为struct1 指针此时未初始化,因此应该没有大小。那么malloc(sizeof *struct1) 如何返回一个有效的内存量来分配呢?

【问题讨论】:

  • 请记住,sizeof 是在编译时解决的,而不是在运行时解决的
  • @PeteBaughman:当然,可变长度数组除外。

标签: c pointers memory struct malloc


【解决方案1】:

sizeof C 中的运算符不计算操作数。它只看类型。例如:

#include <stdio.h>

int main(void)
{
    int i = 0;
    printf("%zu\n", sizeof i++);
    printf("%d\n", i);
    return 0;
}

如果你运行上面的程序,你会看到i仍然是0。

因此,在您的示例中,*struct1 未被评估,它仅用于类型信息。

【讨论】:

  • 所以基本上它会查看结构中的所有数据类型并相应地分配内存?
  • 我从未尝试过这样做,但这只是巧合。谢谢,很好,简洁的答案。
  • 请注意...不是所有的东西都可以通过 C 程序证明,除非它是一个有效的程序。许多人错误地将未定义和实现特定行为的表现形式作为证明。
  • @AlexeyFrunze,是的,你是对的,不能通过例子来证明某事。但是可以举出一些正确的例子。为了证明,人们会查看标准。例如,我所说的版本: sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果为整数常量。
【解决方案2】:
malloc(sizeof(*struct1))

分配的内存量等于结构的大小,具体取决于您声明的结构变量的数量。 sizeof 用于返回 struct1 的大小,是在编译时找到的。

【讨论】:

    【解决方案3】:

    试试这个。先声明结构,

    typedef struct {
    
    int a;
    int b;
    int c;
    
    }MyStruct;
    

    然后在分配内存之前,初始化一个结构变量,并按照给定的方式分配内存,

    MyStruct test;
    
    printf("~~~~~ sizeofStruct: %ld", sizeof(test));
    
    MyStruct *myAlloc = (MyStruct *)malloc(sizeof(test));
    
    printf("~~~~~ sizeofmyAlloc: %ld", sizeof(*myAlloc));
    

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2014-08-22
      • 2012-03-10
      相关资源
      最近更新 更多