如何使用 malloc 为 C 中的结构创建动态内存分配?

Posted

技术标签:

【中文标题】如何使用 malloc 为 C 中的结构创建动态内存分配?【英文标题】:How do I create a dynamic memory allocation using malloc for structures in C? 【发布时间】:2018-11-08 08:39:45 【问题描述】:

我想动态地为“标题”分配内存,因为我不知道标题会有多长时间。我有以下代码:

#include<stdio.h>
#include<malloc.h>

struct film 
    char title[500];
    int year;
    int duration;
    int earnings;
;

void main() 
    int n;
    scanf("%d", &n);
    int array[n], i = 0;
    struct film user[n];

    while (i < n) 
        scanf("%s", &user[i].title);
        scanf("%d", &user[i].year);
        scanf("%d", &user[i].duration);
        scanf("%d", &user[i].earnings);
        i += 1;
    

我尝试替换:

char title[500];

与:

char *title = (char*)malloc(sizeof(char));

但是,它没有用。它说它在“=”之前需要其他东西。另外,如果标题是动态分配的,我如何扫描用户的输入?

以后如何释放内存?我假设它如下:

void freememory(struct film target,  n)  //n is size of structure
    int i = 0;
    while (i < n) 
        free(target[i].title);
        i += 1;
    

正确吗?

【问题讨论】:

有人可以回答我的问题吗? 【参考方案1】:

结构部分只是一个声明,你不能在那里执行任何代码。 malloc 只能在运行时执行。意味着你的结构应该是

typedef struct 
    char* title;
    int year;
    int duration;
    int earnings;
 film;

后来

film user[n];

for(int i=0; i<n; i++)

  char title [200];
  scanf("%s", title);  // scan to temporary buffer since we don't know length
  ...

  user[i]->title = malloc(strlen(title) + 1); // alloc just as much as is needed

您的free() 代码有效。

请注意,这段代码相当幼稚;像这样的微观管理内存在实际应用中可能不是最好的主意。选择一个固定的最大字符串长度,然后确保输入不超过它可能是一个更好的计划,使用fgets 而不是scanf

【讨论】:

感谢您的回答!不过,我有一些问题。您可能会说,我还是 C 的新手,我不明白您所说的微观管理内存是什么意思? fgets 不是用来从文件中获取内容的吗?另外,由于我已经为标题分配了 500 大小的内存(typedef 结构),为什么我仍然在 for 循环下面再次分配内存?而且,我已经尝试阅读:learn-c.org/en/Dynamic_allocation 和 learn-c.org/en/Structures,...................... ..... ........但我不太明白我们什么时候使用“。”和“->”。我认为 -> 仅在所述成员是指针变量时用于访问结构的成员。但是,从 Learn C 的 Dynamic_allocation 部分,它还使用 -> 从结构中访问成员“int age”。或者是否可以同时使用“。”和“->”来访问任何结构成员? @WealthyPlayer 这意味着在一般的 PC/桌面应用程序中,分配 200 字节的固定字符串或精确分配“x”字节并不重要。 fgets 用于从 中获取字符,如果您使用stdin 作为输入流,则可以从控制台获取字符。总体而言,它比scanf 更好用,尤其是在读取字符串时。 @WealthyPlayer [500] 是我的回答中的错字,对此感到抱歉!固定。 @WealthyPlayer 关于-&gt;.,前者只是当您有指向结构的指针时访问成员的便捷方式。写ptr-&gt;title 比写(*ptr).title 更具可读性,但它们在其他方面是等价的。

以上是关于如何使用 malloc 为 C 中的结构创建动态内存分配?的主要内容,如果未能解决你的问题,请参考以下文章

C语言动态数据结构

结构内的字符串 malloc 溢出

C语言 如何给指针数组划分动态存储空间

如何使用 malloc 动态声明结构中存在的数组

C语言中的malloc函数的使用?

malloc() 和 realloc() 结构