C/malloc函数/通过在函数中传递指针来创建结构实例而分配的空间

C/malloc函数/通过在函数中传递指针来创建结构实例而分配的空间,c,memory-management,C,Memory Management,我对本网站()中处理的一个示例有一个问题: 对于32位MCU,“sizeof(struct Person)”执行的大小为16字节(指针为4字节,4字节的3个整数)。 因此,“malloc”函数在RAM中为结构“Person”的新实例分配16个字节。 但事实上,当我们做作“Person”时,实际用于“Person”实例的空间是不同的,可能更重要,这取决于“name”参数的长度 问题:“malloc”函数分配的大小与“Person”实例实际使用的大小之间存在差异,这可能是个问题吗 致以最诚挚的问候。

我对本网站()中处理的一个示例有一个问题:

对于32位MCU,“sizeof(struct Person)”执行的大小为16字节(指针为4字节,4字节的3个整数)。 因此,“malloc”函数在RAM中为结构“Person”的新实例分配16个字节。 但事实上,当我们做作“Person”时,实际用于“Person”实例的空间是不同的,可能更重要,这取决于“name”参数的长度

问题:“malloc”函数分配的大小与“Person”实例实际使用的大小之间存在差异,这可能是个问题吗


致以最诚挚的问候。

strdup函数自己调用
malloc
来分配字符串,因此字符串最终位于需要单独释放的独立内存块中。您可以改为执行以下操作:

struct Person *Person_create(char *name, int age, int height, int weight)
{
    struct Person *who = malloc(sizeof(struct Person) + strlen(name) + 1);
    assert(who != NULL);

    who->name = (char *)(who + 1);
    strcpy(who->name, name);
    who->age = age;
    who->height = height;
    who->weight = weight;

    return who;
}

这将为
struct Person
和名称字符串分配一个具有足够空间的块。这样,你只需要一个
free
调用就可以释放整个东西。

首先,Chris Dodd给出的解决方案非常聪明,但我无法维护,我不会让这样的代码在任何项目中通过审查

其次,
Person
大小和总数据大小的差异本身并不是问题,但您必须了解解除分配的工作原理

如果在
个人*
上调用
free()
,最终将导致内存泄漏
free()
是哑的:它只会释放与
Person*
关联的内存块,并且不知道应该释放的任何其他关联资源(在您的情况下:
Person::name

<>我建议复制C++构造函数/析构函数IDOM:< /P>
  • Person\u create()
    函数正在创建对象
  • void Person\u delete(Person*p)
    应该释放
    name
    并且只有在之后才能释放
    Person
    内存

  • <>在C++中,我们使用操作符<代码>删除>代码>释放析构函数,然后释放对象/结构占用的内存区域。析构函数的任务是确保在我们破坏内存区域之前释放对象所持有的任何资源。

    说什么?您的问题是关于
    Person.name
    的内存吗?该结构仅包含指向该名称的指针。如果你给这个指针赋值,它会指向一个独立于结构本身的内存块。做作结构意味着什么?(另一方面,我建议你做
    struct-Person*who=malloc(sizeof*who);
    而不是
    struct-Person*who=malloc(sizeof(struct-Person));
    ,因此更接近于撤销原则()请澄清这句极其模糊的句子:“一个
    Person
    实例实际使用的空间是不同的,可能更重要”。@fstd:Huh?如果
    malloc
    只返回足够的指针内存,那么
    who
    会指向什么?@JonathanWood,这将是
    sizeof who
    ,但我说
    sizeof*who
    sizeof
    是一个操作符(不是一个函数),它在编译时计算给定表达式类型的大小。
    *who
    的类型是
    struct Person
    @chrisdd的amswe不仅聪明,而且是避免在VLA不可用时发生“struct hack”的标准方法。
    struct Person *Person_create(char *name, int age, int height, int weight)
    {
        struct Person *who = malloc(sizeof(struct Person) + strlen(name) + 1);
        assert(who != NULL);
    
        who->name = (char *)(who + 1);
        strcpy(who->name, name);
        who->age = age;
        who->height = height;
        who->weight = weight;
    
        return who;
    }