W którym z tych kroków alokowana jest pamięć podczas próby przydzielenia tablicy 2D o wymiarach 20x10

Krok 1: int (*p)[10];

Krok 2: p = malloc( 20 * sizeof(*p) );

Czy cała pamięć (20 x 10 x 4 bajty) jest przydzielona w kroku 2, czy też pewna ilość pamięci jest przydzielona również w kroku 1?

2
user1660982 28 wrzesień 2012, 17:05

2 odpowiedzi

Najlepsza odpowiedź

Krok 1 tworzy wskaźnik jako zmienną automatyczną. Wskazany typ to tablica-10-int.

Krok 2 przydziela pamięć dla 20 takich tablic (wydrukuj sizeof(*p), aby zobaczyć, jak duża jest każda tablica -- przydzielony blok jest 20 razy większy) i przypisuje wskaźnik do tego bloku pamięci do p.

Tak więc p wskazuje teraz na pierwszy element tablicy 20 tablic z 10-int.

Jeśli to pomaga zrozumieć, kod jest odpowiednikiem:

typedef int my_array[10];
my_array *p = malloc(20 * sizeof(my_array));

Druga linia tego prawdopodobnie wygląda bardziej jak ta, do której przywykłeś z malloc. Jednak nadal możesz (i powinieneś) używać sizeof(*p) zamiast sizeof(my_array).

malloc jest bardzo prosty – zajmuje liczbę i przydziela tyle bajtów. Nie obchodzi go, do jakiego typu jest pamięć. Więc jeśli masz wątpliwości, ile pamięci alokujesz, zawsze możesz po prostu wydrukować tę liczbę (lub spojrzeć na nią w debugerze).

3
Steve Jessop 28 wrzesień 2012, 17:24

Pierwszy krok to po prostu wskaźnik i nie przydziela niczego poza pojedynczym wskaźnikiem. Pamiętaj, że jest to wskaźnik do tablicy, a nie tablica wskaźników.

Całe miejsce używane w tablicy jest przydzielane przez wywołanie malloc().

4
FatalError 28 wrzesień 2012, 17:10