如何使用malloc()限制购物清单的条目数量为5?
实现基于malloc的最多5条目的购物清单
当然可以用malloc()实现最多5个条目的限制,只需要调整结构体定义并修改初始化逻辑即可。同时我们会修正原代码中的小错误(比如void函数返回0的编译问题),并严格遵循你的要求:
核心修改点
- 调整结构体定义:将固定大小的数组改为动态分配的指针,新增
maxCapacity字段记录最大允许条目数(固定为5)。 - 动态内存分配:初始化购物清单时,用
malloc()分配5个GroceryItem的空间,并检查分配是否成功。 - 修正addItem逻辑:严格遵循length规则(空列表length=0,首次添加到索引0,length更新为元素个数,最多添加5个条目)。
修改后的完整代码
ShoppingList.h头文件
#ifndef SHOPPING_LIST_H #define SHOPPING_LIST_H // 商品条目结构体 struct GroceryItem { char productName[20]; float amount; char unit[10]; }; // 购物清单结构体(动态版本) struct ShoppingList { int length; // 已添加条目数,空列表时为0 int maxCapacity; // 最大允许条目数(固定为5) struct GroceryItem *itemArray; // 动态分配的条目数组 }; // 函数声明 void addItem(struct ShoppingList *list); void printList(struct ShoppingList *list); void editItem(struct ShoppingList *list); void removeItem(struct ShoppingList *list); void saveList(struct ShoppingList *list); void loadList(struct ShoppingList* list); void freeShoppingList(struct ShoppingList *list); // 新增:释放动态内存 #endif
main.c主函数
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include "ShoppingList.h" int main(void) { struct ShoppingList shoppingList; // 初始化动态购物清单:分配最多5个条目空间 shoppingList.maxCapacity = 5; shoppingList.itemArray = malloc(shoppingList.maxCapacity * sizeof(struct GroceryItem)); // 检查内存分配是否成功 if (shoppingList.itemArray == NULL) { printf("内存分配失败!程序退出。\n"); return 1; } shoppingList.length = 0; // 空列表时length为0 int option; do { printf("\n\n欢迎来到购物清单管理器!\n"); printf("=====================================\n\n"); printf("1. 添加条目\n"); printf("2. 显示购物清单\n"); printf("3. 删除条目\n"); printf("4. 修改条目\n"); printf("5. 保存清单\n"); printf("6. 加载清单\n"); printf("7. 退出\n"); printf("请选择操作:"); scanf("%d", &option); switch (option) { case 1: addItem(&shoppingList); break; case 2: printList(&shoppingList); break; case 3: removeItem(&shoppingList); break; case 4: editItem(&shoppingList); break; case 5: saveList(&shoppingList); break; case 6: loadList(&shoppingList); break; case 7: break; default: printf("请输入1-7之间的数字!\n"); } } while (option != 7); // 释放动态分配的内存,避免内存泄漏 freeShoppingList(&shoppingList); return 0; }
addItem函数实现(含内存释放函数)
#define _CRT_SECURE_NO_WARNINGS #include "ShoppingList.h" #include <stdio.h> #include <stdlib.h> // 释放购物清单的动态内存 void freeShoppingList(struct ShoppingList *list) { if (list->itemArray != NULL) { free(list->itemArray); list->itemArray = NULL; list->length = 0; list->maxCapacity = 0; } } /* 严格遵循要求: - 空列表时length为0,首次添加条目到itemArray[0] - 最多添加5个条目,超出时提示无法添加 - 添加后更新length为当前条目数 */ void addItem(struct ShoppingList* list) { // 检查是否已达最大容量 if (list->length >= list->maxCapacity) { printf("购物清单已达最大容量(5个条目),无法添加新条目!\n"); return; } int currentIndex = list->length; // 空列表length=0,首次添加到索引0 printf("请输入商品名称:"); scanf("%s", list->itemArray[currentIndex].productName); do { printf("请输入数量:"); scanf("%f", &list->itemArray[currentIndex].amount); if (list->itemArray[currentIndex].amount <= 0.0) { printf("输入无效,请输入正数!\n"); } } while (list->itemArray[currentIndex].amount <= 0.0); printf("请输入单位:"); scanf("%s", list->itemArray[currentIndex].unit); printf("%s 已添加到购物清单。\n", list->itemArray[currentIndex].productName); // 更新length为当前条目数 list->length++; }
关键说明
- 动态内存限制:用
malloc()分配固定5个条目的空间,确保无法添加超过5个条目,超出时会给出明确提示。 - 内存泄漏防护:新增
freeShoppingList()函数,在程序退出前释放动态内存,避免内存泄漏。 - 编译错误修正:原代码中
addItem()为void类型却返回0,已修正为直接return;。 - 规则适配:严格按照你要求的空列表length=0、首次添加到索引0的逻辑实现,同时保证length准确反映当前条目数。
内容的提问来源于stack exchange,提问作者Hejhej12
相关产品推荐
相关产品推荐

