Ваша функция имеет невозможный интерфейс.Он принимает указатель part *
.Этот указатель входит в функцию по значению.Внутри функции, которую вы ей назначаете, из вызова malloc
или realloc
.Но вызывающая сторона не увидит это обновленное значение.Когда функция возвращается, выделенная вами память просочилась, и вызывающая сторона имеет исходное значение указателя (возможно, нулевое).
Кроме того, лучше инкапсулировать динамические массивы в структуру.У вас есть переменная "count count", которая сама по себе свободна и должна передаваться везде вместе с массивом, чтобы отслеживать ее размер.Как насчет упаковки их вместе:
typedef struct part_list {
struct part *part;
int count;
} part_list;
Теперь есть функция для инициализации пустого списка деталей.Этот должен вызываться всеми, кто хочет использовать другие функции part_list
.
void part_list_init(part_list *pl)
{
pl->part = 0;
pl->count = 0;
}
Затем напишите свою функцию для добавления деталей.
int part_list_add(part_list *pl)
{
part_list *p;
int index = pl->count++; /* increment count, keep old value */
/* realloc accepts a null pointer and then behaves like malloc */
p = realloc(pl->part, sizeof *pl->part * pl->count);
if (p == 0)
return 0; /* failed to allocate/extend array */
p1->part = p;
if ((pl->part[index].name = malloc(64)) == 0) {
pl->count = index; /* roll back the count: we didn't really allocate this part */
return 0;
}
/* your code, updated with pl-> access */
printf("Please enter item name: \n");
scanf("%63s", pl->part[index].name); /* 63s not 64s!!! One byte for NUL char! */
printf("Please enter item price: \n");
scanf("%f", &pl->part[index].price); /* check the return value of scanf!!! */
printf("Please enter item quantity: \n");
scanf("%d", &pl->part[index].quantity);
return 1; /* 1 means success */
}