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

C语言中未初始化局部变量‘m’使用报错原因咨询

解决“未初始化局部变量‘m’使用”的错误

咱们直接揪出问题根源:你的medication结构体里,name是char*指针类型,但在createMedication函数中声明局部变量medication m;时,m.name会变成一个未初始化的野指针——它指向内存里的随机地址,根本不是一块合法的、可用来存储字符串的空间。这时候调用strcpy(m.name, name),相当于往不确定的内存地址写数据,编译器自然会抛出“未初始化局部变量‘m’使用”的错误。

下面给你两种实用的解决思路:

方案1:将结构体name改为固定大小字符数组

如果药品名称的长度是可控的,直接在结构体里定义足够大的字符数组,这样局部结构体变量m的name成员会自动分配栈空间,无需手动管理内存:

修改头文件的结构体:

#pragma once
typedef struct {
    char name[100]; // 按需求设置合适大小,比如100足够存大部分药品名
    float concentration;
    int quantity;
    float price;
} medication;

// 补全完整的函数声明
medication createMedication(char name[], float concentration, int quantity, float price);

此时你的createMedication函数无需修改,strcpy(m.name, name)就能正常工作,因为m.name现在是一块合法的栈内存空间。

方案2:为name动态分配内存

如果药品名称长度不确定,需要灵活分配内存,那就要在函数里给m.name分配足够的空间(记得包含stdlib.h头文件使用malloc):

修改后的createMedication函数:

#include <stdlib.h>
#include <string.h>
#include "你的头文件名.h" // 替换成实际的头文件名

medication createMedication(char name[], float concentration, int quantity, float price) {
    medication m;
    // 分配内存:字符串长度+1(用来存储结束符'\0')
    m.name = malloc(strlen(name) + 1);
    if (m.name == NULL) {
        // 处理内存分配失败的情况,比如打印错误并终止程序
        fprintf(stderr, "内存分配失败\n");
        exit(EXIT_FAILURE);
    }
    strcpy(m.name, name);
    m.concentration = concentration;
    m.price = price;
    m.quantity = quantity;
    return m;
}

⚠️ 注意:使用动态分配内存的话,后续用完这个medication变量后,一定要调用free(m.name)释放内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:27:29