"Podwójny" wskaźnik na tablicę

0

Mam problem ze zrozumieniem "podwójnego" wskaźnika na tablicę. Przydzielam pamięć na 10 elementów tablicy zawierającej wskaźniki i wszystko do tego momentu jest w porządku.

int** ta = (int**) malloc(10 * sizeof(int*));

Wydawało mi, że następnie dostęp do tablicy możliwy będzie poprzez

*ta[i]

...natomiast można się do tej tablicy odwoływać zwyczajnie:

ta[i]

Dla przykładu poniższy kod działa:

	int i = 0;
	int** ta = (int**) malloc(10 * sizeof(int*));
	
	srand(10);
	for(i = 0; i < 10; i++) {
		ta[i] = rand() % 10;
		printf("%d\n", ta[i]);
	}

Program wyświetla liczby, a nie (jak się spodziewałem) ich adresy wyświetlane jako %d:

1
9
2
4
7
6
2
2
6
9

Czy ktoś może wyjaśnić dlaczego?

3

To co robisz to UB - przypisujesz do elementu tablicy wskaźników - czyli do wskaźnika liczbę. Owszem, w większości przypadków będzie to działać ale to niczym się nie różni od napisania int* ptr = 42 i twierdzenia, że tablica/wskaźnik to liczba.

Inaczej mówiąc, do każdego z elementów tablicy powinieneś przypisać adres (np. zwrócony przez malloc) i dopiero wtedy na tym wskaźniku operować, ale jak na wskaźniku, a nie jak na liczbie.

1

Zapoznaj się z inkrementacją bo jej nie rozumiesz: http://4programmers.net/Forum/1101404

Po: int** ta = (int**) malloc(10 * sizeof(int*));
ta[i] to i-ty wskaźnik na tablicę int'ów
Teraz potrzebujesz te tablice przydzielić, bo to jest dla tablicy dwuwymiarowej.
Wydaje mi się że potrzebujesz:

int i = 0;
int *ta=(int*)malloc(10*sizeof(int));
srand(10);
for(i=0;i<10;++i) ta[i]=rand()%10;
for(i=0;i<10;++i) printf("%d\n",ta[i]);

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