dynamisk allokering
Allokera tillräckligt med minne för att få plats med nuvarande inköpslista men inte mer
Hej, Jag ska fortsätta med min shoppinglist och nu ska jag dynamisk allokera den istället för att ha en bestämd array av itemlist.
Jag har ändrat itemlist till en pekare som på bilden samt lagt till denna kod, dock så vet jag inte hur jag ska gå vidare härifrån och om jag har deklarerat min dynamiska minne korrekt
struct GroceryItem *temp = (struct GroceryItem*) malloc(sizeof(struct GroceryItem));
if (temp != NULL)
{
struct GroceryItem *temp = (struct GroceryItem*)
realloc(list -> itemList, sizeof(struct GroceryItem));
}
Du måste ju fortfarande på något sätt ha en referens till dina noder, men det kanske är tänkt att ShoppingList ska vara din lista. Du har också memory leak. Om du kör programmet tillräckligt många gånger kommer du behöva starta om din dator. :)
Du måste också använda free för att avallokera minne innan du avslutar körningen.
realloc kan användas för att göra din array längre om du inte vill ha en lista
vilket jag tycker vore det mer naturliga valet för att hålla dina GroupItems
för att lägga till en ny nod:
void addItem(struct ShoppingList* list)
{
// din array är i ShoppingList, där finns också length.
// för att utöka arrayen så kan man använda realloc
// man måste kollar returvärde på realloc, det är en pekare till den ny arrayen
// låt oss nu försöka utöka listan med ett element:
struct GroceryItem* newArray = realloc(list->itemList, list->length + 1, sizeof(struct GroceryItem));
if (newArray != NULL)
{
list->itemList = newArray; // den nya, större arrayen
enterDetails(list->itemList + list->length); // en funktion för att fylla GroceryItem
list->length++;
}
else
{
perror("Out of memory");
}
}
f.ö. är fflush(stdin) som du har är UB undefined behavior, man får inte använda det på stdin,
använd istället fgets,sscanf när du läser in från tangentbordet.
Något i still med
// för att hålla I/O borta från addItem
void enterDetails(GroceryItem* newItem)
{
printf("Product name:");
fflush(stdout);
char product[SIZE];
if (fgets(product, SIZE, stdin) != NULL)
{
if (sscanf("%s", newItem->productName) == 0)
{
perror("No product name given");
}
}
...
}