【问题标题】:How do I create a dynamic memory allocation using malloc for structures in C?如何使用 malloc 为 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;
    }

正确吗?

【问题讨论】:

  • 有人可以回答我的问题吗?

标签: c memory-management malloc structure free


【解决方案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_allocationlearn-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 更具可读性,但它们在其他方面是等价的。
猜你喜欢
  • 2015-11-09
  • 2015-06-27
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多