Один из комментариев говорит:
Мне нужно выделить место для size1
продуктов для каждого из size
клиентов, а затем ввести сведения о продуктах для каждогоclient.
Перво-наперво:
- Отделите размеры ввода-вывода от кода, который их использует.Это фундаментальный метод программирования.
Функция должна выполнять одну работу - ваша выполняет (как минимум) две: получить размеры и выделить место для данных, заданных этими размерами (и, вероятно, затемпродолжает заполнять пространство дополнительными операциями ввода / вывода).
Это означает, что ваш код должен быть разбит как минимум на две функции, вторая из которых становится чем-то вроде bool InitCashReg(size_t n_client, size_t n_prod, Cart **pdata)
, возвращая success / true илисбой / ложное состояние и принятие в качестве аргументов того, что вы называли size
и size1
, вместо того, чтобы пытаться их прочитать.Я не собираюсь копировать код ввода / вывода;Я просто сконцентрируюсь на коде выделения памяти.
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;
}
Этот код не был скомпилирован, тем более проверен.
Iиспользовал calloc()
для выделения массива продуктов, чтобы все данные обнулялись;вместо этого вы можете использовать malloc()
и установить для переменных name
, amount
и price
значение 0
другим способом.Обратите внимание, что это вместе с изобретенным CLIENT_DEFAULT_ID
гарантирует, что вся выделенная память инициализируется известными значениями.
(C ++ имеет конструкторы, которые можно использовать для обеспечения правильной инициализации. C не имеет конструкторов, поэтомуВы должны убедиться, что выделенные данные правильно инициализированы.)