Alokacja calej tablicy i poszczegolych elementow.

0
  char **choices_num;
  char *choices[]={
  "GREEN",
  "RED",
  "BLUE",
  "YELLOW",
  "WHITE",
  "MAGENTA",
  "BLACK",
};
 
  my_items = malloc((n_choicec +1) * sizeof(ITEM *));
  choices_num = malloc(n_choices * sizeof(char *));
  for(int i = 0;i < n_choices;++i){
    choices_num[i]=malloc(2* sizeof(char));    
    sprintf(choices_num[i],"%d",i+1);
    my_items[i] = new_item(choices_num[i],choices[i]);
  }

chcialem zapytac, dlaczego musze alokowac kazdy element z osobna w linijce

    choices_num[i]=malloc(2* sizeof(char));    

skoro zaalokowalem juz cala pamiec dla tablicy tutaj

  choices_num = malloc(n_choices * sizeof(char *));

??

2

Zaalokowałeś pamięć dla tablicy, trzeba to zrobić także dla poszczególnych elementów.

2

Alokacja pamięci dla tablicy oznacza alokację takiej pamięci, żeby pomieścić n_choices wskaźników, nic więcej.
A jeśli zapytasz czemu nie można od razu zaalokować całej potrzebnej pamięci: każdy z tych wskaźników może wskazywać na obszar pamięci o innym rozmiarze, więc nie da się na początku od razu określić ile pamięci trzeba zaalokować.

0

A jeszcze mam pytanie odnosnie tego:

  #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))

  char **choices_num;
  char *choices[]={
  "GREEN",
  "RED",
  "BLUE",
  "YELLOW",
  "WHITE",
  "MAGENTA",
  "BLACK",
};
  ITEM **my_items;
  int n_choices = ARRAY_SIZE(choices),number = 1;
  
  my_items = malloc((n_choices + 1)* sizeof(ITEM *));
  choices_num = malloc(n_choices * sizeof(char *));
    for(int i = 0;i < n_choices;++i){
    choices_num[i]=malloc(2* sizeof(char));    
    sprintf(choices_num[i],"%d",i+1);
    my_items[i] = new_item(choices_num[i],choices[i]);
  }

dlaczego w linijce

my_items = malloc((n_choices + 1)* sizeof(ITEM *));

musi byc n_choices + 1 ? n_choices == 7, a itemow ktore alokuje tez jest 7, dlaczego wiec tam w tym malloc musi byc 7 + 1 ?

0

const char *choices[] to raz. nie ma potrzeby robienia n_choices+1, to dwa. nie widzę sensu robienia malloca dla dwóch charów, to trzy. kod jest nieczytelny, to cztery.

0
  my_items = malloc(n_choices * sizeof(ITEM *));
  choices_num = malloc(n_choices * sizeof(char *));
  
    for(int i = 0; i < n_choices - 1; ++i){
    choices_num[i] = malloc(2 * sizeof(char));    
    sprintf(choices_num[i], "%d", i+1);
    my_items[i] = new_item(choices_num[i], choices[i]);
  }

Teraz dobrze ?dalem "-1" w petli for, to najlepsze wyjscie z sytuacji czy lepiej cos innego ?

dobra dalem na koncy tablicy "(char *)NULL" , tablica musi sie konczyc nullem, ok, solved

1 użytkowników online, w tym zalogowanych: 0, gości: 1