W tym programie (C, nie C++), dlaczego malloc zawsze zwraca prawidłowy rozmiar, niezależnie od użycia operatora sizeof?Czy wymagany jest operator sizeof dla malloc?
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *c = malloc(3);
short *s = malloc(3); /* or malloc(3 * sizeof(short))? */
int *i = malloc(3); /* or malloc(3 * sizeof(int))? */
long *l = malloc(3); /* or malloc(3 * sizeof(long))? */
printf("%p\n", c++);
printf("%p\n", c++);
printf("%p\n", c++);
printf("---\n");
printf("%p\n", s++);
printf("%p\n", s++);
printf("%p\n", s++);
printf("---\n");
printf("%p\n", i++);
printf("%p\n", i++);
printf("%p\n", i++);
printf("---\n");
printf("%p\n", l++);
printf("%p\n", l++);
printf("%p\n", l++);
return 0;
}
Wyjście jest:
0x1e82010 (1 byte)
0x1e82011
0x1e82012
---
0x1e82030 (2 bytes)
0x1e82032
0x1e82034
---
0x1e82050 (4 bytes)
0x1e82054
0x1e82058
---
0x1e82070 (8 bytes)
0x1e82078
0x1e82080
Am I czegoś brakuje?
4.0.4-303.fc22.x86_64 dzyń wersja 3.5.0 (tags/RELEASE_350/końcowy) docelowa: x86_64-RedHat-linux-gnu modelu Temat: POSIX
Robisz arytmetyczne adresy; nie masz dostępu do pamięci, która jest równie dobra, ponieważ przydzielono tylko 3 bajty, więc dla wszystkich z wyjątkiem części 'char *' uzyskujesz dostęp do pamięci poza granicami. –
To, co robisz, to niezdefiniowane zachowanie. Fakt, że "wydaje się" działać, nie czyni go legalnym (lub ważnym). Możesz ustawić te wskaźniki na 'NULL' i uzyskać takie same wyniki. – Cornstalks
W jaki sposób ustaliłeś, ile przydzielono pamięci malloc? –