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 odpowiedzi
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).
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()
.
Podobne pytania
Powiązane pytania
Nowe pytania
c
C jest językiem programowania ogólnego przeznaczenia, używanym do programowania systemów (system operacyjny i systemy wbudowane), bibliotek, gier i wielu platform. Ten znacznik powinien być używany w przypadku ogólnych pytań dotyczących języka C, zgodnie z definicją w standardzie ISO 9899 (najnowsza wersja 9899: 2018, chyba że określono inaczej - również oznaczanie żądań dotyczących wersji za pomocą c89, c99, c11 itd.). C różni się od C ++ i nie należy go łączyć ze znacznikiem C ++ bez racjonalnego powodu.