Используя sizeof () на malloc'd памяти [дубликат]

15
задан Community 23 May 2017 в 10:29
поделиться

5 ответов

Потому что размер "строкового" указателя составляет 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 () не скажет вам этого.

См. Мой предыдущий вопрос об этом, и вы увидите даже мое отсутствие у меня начального понимания.

19
ответ дан 1 December 2019 в 00:54
поделиться

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 );
-1
ответ дан 1 December 2019 в 00:54
поделиться

В 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 вам не поможет.

10
ответ дан 1 December 2019 в 00:54
поделиться

Вы не можете. Как уже указывалось, вы можете получить размер void * , размещенного на месте, но это мало что вам скажет.

Вы не можете получить размер malloed * mallocated . То есть нет вызова функции для возврата 100 (в вашем примере) - если вы не пишете свои собственные процедуры управления памятью.

Самый простой способ - это просто где-то запомнить ... может быть ....

stuct {
  void *data;
  unsigned int size
 } myStructureWhichRemebersItsSize;

myStructureWhichRemebersItsSize *someData;
someData.data = malloc(100);  // and check for NULL
someData.size = 100;
4
ответ дан 1 December 2019 в 00:54
поделиться

sizeof возвращает размер указателя (void *), который вы ему передали, а не размер выделенной памяти. Вам придется хранить размер памяти в отдельной переменной, если вы захотите использовать ее позже.

9
ответ дан 1 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: