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;