如何使用 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 关于->
与.
,前者只是当您有指向结构的指针时访问成员的便捷方式。写ptr->title
比写(*ptr).title
更具可读性,但它们在其他方面是等价的。以上是关于如何使用 malloc 为 C 中的结构创建动态内存分配?的主要内容,如果未能解决你的问题,请参考以下文章