You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中用malloc为结构体的title字段实现动态内存分配?

解决结构体title动态分配内存的问题

咱们一步步拆解你的问题,把代码修正过来:

1. 结构体成员动态指针的定义错误

你在结构体定义里直接写char *title = (char*)malloc(sizeof(char));会报错,因为C语言的结构体定义中不能直接给成员变量赋值(包括调用malloc),结构体成员的内存分配要在创建结构体实例之后进行。正确的结构体定义应该先把title声明为字符指针:

#include <stdio.h>
#include <stdlib.h>  // malloc/free需要的标准头文件,建议替换非标准的malloc.h
#include <string.h>  // 字符串操作函数所需的头文件

struct film {
    char *title;  // 仅声明指针,后续再分配内存
    int year;
    int duration;
    int earnings;
};

2. 读取输入到动态分配的title中

直接用scanf("%s")读取到动态指针里容易出现内存溢出,推荐先把输入读到临时缓冲区,再根据输入长度分配对应内存,最后拷贝内容:

int main() {
    int n;
    scanf("%d", &n);
    struct film user[n];  // 变长数组(C99及以上标准支持)
    int i = 0;

    while (i < n) {
        char temp_buf[1024];  // 临时缓冲区,足够容纳常规长度的输入
        // 先把title读取到临时缓冲区
        scanf("%s", temp_buf);
        // 分配内存:长度为字符串实际长度+1(用于存储结束符'\0')
        user[i].title = malloc(strlen(temp_buf) + 1);
        // 检查内存分配是否成功,避免空指针操作
        if (user[i].title == NULL) {
            fprintf(stderr, "内存分配失败!\n");
            // 先释放已分配的内存再退出
            freememory(user, i);
            return 1;
        }
        // 把临时缓冲区的内容拷贝到动态内存中
        strcpy(user[i].title, temp_buf);

        // 读取其他字段
        scanf("%d", &user[i].year);
        scanf("%d", &user[i].duration);
        scanf("%d", &user[i].earnings);

        i += 1;
    }

    // 这里可以添加使用数据的业务逻辑

    // 用完数据后释放内存
    freememory(user, n);
    return 0;
}

如果你使用GCC编译器,也可以用扩展语法scanf("%ms", &user[i].title);,它会自动分配足够的内存存储输入的字符串,但这个写法不属于标准C,兼容性稍差。

3. 内存释放函数的修正

你写的释放函数存在参数类型错误、语法不完整的问题,修正后的版本如下:

void freememory(struct film *target, int n) {
    int i = 0;
    while (i < n) {
        if (target[i].title != NULL) {  // 避免重复释放空指针
            free(target[i].title);
            target[i].title = NULL;  // 置空指针,防止后续出现野指针问题
        }
        i += 1;
    }
}

注意:struct film user[n];是栈上分配的变长数组,不需要用free释放,我们只需要释放每个title指向的堆内存即可。

内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:00:44