Потому что размер "строкового" указателя составляет 8 байтов. Вот несколько примеров использования sizeof ()
с соответствующим «размером». Термин size_of ()
иногда вводит в заблуждение людей, которые не привыкли его использовать. В вашем случае размер указателя составляет 8 байт .. ниже представлено представление типичной 32-битной системы.
sizeof (char) = 1
sizeof (double) = 8
sizeof (float) = 4
sizeof (int) = 4
sizeof (long) = 4
sizeof (long long) = 8
sizeof (short) = 2
sizeof (void *) = 4
sizeof (clock_t) = 4
sizeof (pid_t) = 4
sizeof (size_t) = 4
sizeof (ssize_t) = 4
sizeof (time_t) = 4
Вы упускаете из виду, как вы определяете, что ваша строка исчезает (массив символов). Вероятно, он передается функции, которой вам нужно передать явную длину в качестве переменной или где-то ее отслеживать. Использование sizeof ()
не скажет вам этого.
См. Мой предыдущий вопрос об этом, и вы увидите даже мое отсутствие у меня начального понимания.
void *
- это тип области памяти, если вы не знаете, что она содержит. Этого следует избегать.
char *
- это тип значения, которое указывает на некоторую ячейку памяти, которая содержит char
. Определение места в памяти занимает восемь байтов.
sizeof
сообщает вам, сколько байтов занимает конкретный тип. Не то, сколько памяти было выделено с помощью malloc
, а сколько памяти компилятор знает, какой тип должен занять . Применение sizeof
к значениям часто считается плохим стилем и, как уже упоминалось здесь, иногда вызывает умное поведение в C99.
char [100]
тип значения, содержащего 100 символов. char [100] a;
- строка из 100 char
s в стеке.
char (*) [100]
- это тип указателя на значение, содержащее 100 символов. char (* b) [100];
заставляет b
указывать на 100 символов, возможно, в куче. Вам, вероятно, понадобится
char (*s)[100] = malloc( sizeof( char[100] ) );
printf( "%u byte pointer to %u bytes of size %u elements\n",
sizeof s, sizeof *s, sizeof **s );
В C89 оператор sizeof
находит только размер переменной в байтах во время компиляции (в данном случае 8-байтовый указатель void
). Он работает так, как вы ожидаете, он будет работать с простыми массивами, потому что их размер известен во время компиляции.
char arr[100]; // sizeof arr == 100
char *p = arr; // sizeof p == 4 (or 8 on 64-bit architectures)
char *p = malloc(100); // sizeof p == 4 (or 8). Still!
Чтобы узнать размер памяти, выделенной кучей, вам нужно отслеживать его вручную, sizeof
вам не поможет.
Вы не можете. Как уже указывалось, вы можете получить размер void *
, размещенного на месте, но это мало что вам скажет.
Вы не можете получить размер malloed * mallocated
. То есть нет вызова функции для возврата 100 (в вашем примере) - если вы не пишете свои собственные процедуры управления памятью.
Самый простой способ - это просто где-то запомнить ... может быть ....
stuct {
void *data;
unsigned int size
} myStructureWhichRemebersItsSize;
myStructureWhichRemebersItsSize *someData;
someData.data = malloc(100); // and check for NULL
someData.size = 100;
sizeof
возвращает размер указателя (void *
), который вы ему передали, а не размер выделенной памяти. Вам придется хранить размер памяти в отдельной переменной, если вы захотите использовать ее позже.