C99 / ANSI C problem z zapisywaniem do dynamicznie zaalokowanej tablicy

0

Oto moj program:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define SIZE 201

void wczytaj(int* tablica, char* line) {
  char* tmp = line;
  // zaalokuj tyle elementow jaka liczbe przedstawia pierwszy token +1,
  // (ale pozostaw go w tablicy!)
  int number_of_elements = atoi(line);
  printf("Number of elements: %d\n", number_of_elements);
  if( (tablica = malloc( sizeof(int) * (number_of_elements + 2)) ) == NULL) {
    fprintf(stderr, "Malloc error\n");
    exit(1);
  }
  printf("sizeof(int): %d\n", sizeof(int));
  printf("Tablica address after malloc: %d\n", tablica);
  
  int i = 0;
  while( (tmp = strtok(tmp, " ")) ) {
    *tablica = atoi(tmp);
    ++tablica; ++i;
    if(i == 2)
 	break;
    tmp = NULL;
  }
  
  printf("Tablica address after loop: %d\n", tablica);
  // point at the begin of the array
  tablica = tablica - i;
  printf("Tablica address - should be same as after malloc: %d\n", tablica);
}


// program zaklada poprawnosc danych wejsciowych
int main()
{
  int* tablica = NULL;
  char bufor[SIZE];
  int t;
  scanf("%d", &t);
  getchar();
  
  for(int i = 0; i < t; ++i) {
    fgets(bufor, SIZE-1, stdin);
    bufor[strlen(bufor)-1] = '\0';
    wczytaj(tablica, bufor);
    // tablica wskazuja na 0, dlaczego
    printf("Tablica address outside: should be the same as after malloc: %d\n", tablica);
    // sprzata sie to free()
    free(tablica);
  }
  
  return 0;
}

Przykladowy test:

1
2 3 4
Number of elements: 2
sizeof(int): 4
Tablica address after malloc: 10510400
Tablica address after loop: 10510408
Tablica address - should be same as after malloc: 10510400
Tablica address outside: should be the same as after malloc: 0

Nie rozumiem dlaczego po wyjsciu z funkcji zmienna wskaznikowa nie wskazuje na poczatek zaalokowanego obszaru w pamieci. Jak to naprawic? Pierwszym rozwiazaniem wydaje sie alokacja pamieci poza funkcja w czesci main. Moim zdaniem jest to mniej eleganckie.

Wszelkie dodatkowe uwagi co poprawic w kodzie mile widziane.

Pozdrawiam,

Poprawa oczywistego dosc bledu:

    if(i == number_of_elements)
         break;
0

Nie rozumiem dlaczego po wyjsciu z funkcji zmienna wskaznikowa nie wskazuje na poczatek zaalokowanego obszaru w pamieci.

Dlatego, bo wskaźnik tablica jest zmienną lokalną.

Opcje są dwie:

void wczytaj(int** tablica, char* line) 
{
	(...)

	int* tab = malloc(...);
	if(tab == NULL) 
	
	(...)

	*tablica = tab;
}

/* użycie */
wczytaj(&tablica, bufor);

lub

int* wczytaj(char* line) 
{
	(...)

	int* tablica = malloc(...);
	if(tablica == NULL) 
	
	(...)
	
	return tablica;
}

/* użycie */
tablica = wczytaj(bufor);

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