2 svar
162 visningar
Didar 212
Postad: 16 okt 2022 00:28

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));    

    }

 

 

    

Fermatrix 7841 – Fd. Medlem
Postad: 16 okt 2022 01:00

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.

anders_k 237
Postad: 16 okt 2022 14:53

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");
    }
  }
  ...
}
Svara
Close