Znaleźć długość tablicy malloc() w C? [duplikat]
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()
.
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[]
.
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*)
.
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.
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.
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