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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:10:16