带嵌套结构的代码-分配内存的正确方法是什么?

时间:2019-02-13 02:07:03

标签: c

我写了这段代码(*pdata)->pProd = (Product*)malloc(sizeof(Product)*size1);

当我在“ (*pdata)->pProd”中输入详细信息时,编译器停止了。 如何为“ Product* pProd”分配内存并输入详细信息?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    char name[30];
    int amount;
    int price;
}Product;

typedef struct
{
    int id;
    Product* pProd;
    int numProd;
}Cart;

void InitCashReg(Cart** pdata) {
    int size,size1,j=0,i;
    int PriceAllProd=0;

    printf("Enter number of client --> \n");
    scanf("%d", &size);

    printf("Enter number of product client bought --> \n");
    scanf("%d", &size1);

    *pdata = (Cart*)malloc(sizeof(Cart)*size);
    if (*pdata == NULL)
    {
        printf("cannot allocate memory\n");
        return -1;
    }
    (*pdata)->pProd = (Product*)malloc(sizeof(Product)*size1);
    if ((**pdata).pProd == NULL)
    {
        printf("cannot allocate memory\n");
        return -1;
    }

    …

1 个答案:

答案 0 :(得分:1)

comments之一说:

  

我需要为size1个客户的每个size产品分配空间,然后为每个客户输入产品的详细信息。

第一件事:

  • 将I / O查找大小与使用它们的代码分开。这是编程中的一项基本技术。

一个函数应该完成一项工作-您的工作(至少)完成两项:获取大小,并为给定大小的数据分配空间(然后可能会继续使用更多I / O操作填充空间)

这意味着您的代码应至少分为两个功能,第二个功能类似于bool InitCashReg(size_t n_client, size_t n_prod, Cart **pdata),返回成功/正确或失败/错误状态,并采用您所说的sizesize1作为参数,而不是尝试读取它们。我不会复制I / O代码。我只关注内存分配代码。

enum { CLIENT_DEFAULT_ID = -1 };

bool InitCashReg(size_t n_client, size_t n_prod, Cart **pdata)
{
    Cart *cart = malloc(sizeof(*cart) * n_client);
    if (cart == 0)
        return false;
    for (size_t i = 0; i < n_client; i++)
    {
        cart[i]->pProd = calloc(sizeof(*cart[i]->pProd), n_prod);
        if (cart[i].pProd == 0)
        {
            // Release already allocated space
            for (size_t j = 0; j < i; j++)
                free(cart[j]->pProd);
            free(cart);
            return false;
        }
        cart[i].numProd = n_prod;
        cart[i].id = CLIENT_DEFAULT_ID;
    }
    *pdata = cart;
    return true;
}

此代码尚未编译,未经测试。

我使用calloc()分配产品数组,以便数据全部归零;您可以改用malloc(),并通过其他方式将nameamountprice变量设置为0。请注意,这与发明的CLIENT_DEFAULT_ID一起确保将所有分配的内存初始化为已知值。

(C ++具有可用于确保正确初始化的构造函数。C没有构造函数,因此必须确保分配的数据已正确初始化。)