我写了这段代码(*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;
}
…
答案 0 :(得分:1)
comments之一说:
我需要为
size1
个客户的每个size
产品分配空间,然后为每个客户输入产品的详细信息。
第一件事:
一个函数应该完成一项工作-您的工作(至少)完成两项:获取大小,并为给定大小的数据分配空间(然后可能会继续使用更多I / O操作填充空间)
这意味着您的代码应至少分为两个功能,第二个功能类似于bool InitCashReg(size_t n_client, size_t n_prod, Cart **pdata)
,返回成功/正确或失败/错误状态,并采用您所说的size
和size1
作为参数,而不是尝试读取它们。我不会复制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()
,并通过其他方式将name
,amount
和price
变量设置为0
。请注意,这与发明的CLIENT_DEFAULT_ID
一起确保将所有分配的内存初始化为已知值。
(C ++具有可用于确保正确初始化的构造函数。C没有构造函数,因此必须确保分配的数据已正确初始化。)