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
相关产品推荐
相关产品推荐

