Znaleźć długość tablicy malloc() w C? [duplikat]

to pytanie ma już odpowiedzi tutaj : Zamknięte 8 lat temu .

Możliwy duplikat:
Jak znaleźć sizeof (wskaźnik wskazujący na tablicę)

Uczę się jak stworzyć tablicę dynamiczną w C, ale natknąłem się na problem, którego nie mogę rozgryźć.

Jeśli użyję kodu:

int num[10];
for (int i = 0; i < 10; i++) {
    num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));

Otrzymuję wyjście:

sizeof num = 40
sizeof num[0] = 4

Tego się spodziewałam. Jeśli jednak będę miał rozmiar tablicy jak:

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

Potem otrzymuję wyjście:

sizeof num = 8
sizeof num[0] = 4

Jestem ciekaw, dlaczego rozmiar tablicy wynosi 40, gdy używam metody stałej długości, ale nie gdy używam malloc().

Author: GCBenson, 2012-12-22

4 answers

W drugim przypadku {[0] } nie jest tablicą, jest wskaźnikiem. sizeof daje rozmiar wskaźnika, który wydaje się być 8 bajtów na twojej platformie.

Nie ma możliwości poznania rozmiaru dynamicznie przydzielanej tablicy, trzeba ją zapisać gdzie indziej. sizeof wygląda na typ, ale nie można uzyskać kompletnego typu tablicy (typu tablicy o określonym rozmiarze, jak typ int[5]) z wyniku malloc w żaden sposób, a argument sizeof nie może być zastosowany do typu niekompletnego, jak int[].

 30
Author: effeffe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-22 17:18:37

Tablice nie są wskaźnikami(rozpad na wskaźniki w niektórych sytuacjach, nie tutaj).

Pierwsza jest tablicą-więc sizeof daje rozmiar tablicy = 40 bajtów.

Drugi jest wskaźnikiem (niezależnie od tego, ile elementów wskazuje) - sizeof daje sizeof(int*).

 5
Author: Luchian Grigore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-22 16:58:22

Drugi rozmiar odnosi się do rozmiaru wskaźnika, który w Twoim komputerze-prawdopodobnie 64-bitowym-wynosi 8 bajtów.

Nie można użyć sizeof(), aby odzyskać rozmiar dynamicznie przydzielanej struktury, ale można to zrobić dla statycznie przydzielanych struktur.

 2
Author: Rubens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-22 16:58:20

Jeśli chcesz wiedzieć, jaki jest rozmiar czegoś, co przydzieliłeś, musisz to "zapamiętać", ponieważ twój kod to przydzielił. Jeśli twój kod nie dokonał alokacji, nie ma sposobu [w standardowym sensie], aby dowiedzieć się, jak duża jest pamięć, na którą wskazuje wskaźnik. Musisz tylko "wiedzieć" w inny sposób.

 2
Author: Mats Petersson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-22 17:02:12