Возвращает ли sizeof объем выделенной памяти? - PullRequest
1 голос
/ 05 мая 2020

Я читал, что:

оператор sizeof возвращает размер типа данных, а не объем памяти, выделенной для переменной.

Разве это не количество из выделенной памяти зависит от размера типа данных? Я имею в виду, что sizeof вернет 4 ( зависит от архитектуры ), когда я передам ему int.

Я что-то упустил?

Ответы [ 4 ]

2 голосов
/ 05 мая 2020

sizeof возвращает количество байтов, которое занимает массив, выделенный переменной или стеку.

Примеры:

  • sizeof(char)=1 (в большинстве конфигураций)
  • Но sizeof(char*)=8 (в зависимости от платформы)
  • Если вы динамически выделяете память с помощью malloc, вы получите указатель на этот блок памяти. Если использовать на нем sizeof, вы просто получите размер указателя.
  • Однако sizeof() массив, выделенный стеком, например, когда вы пишете int a[10], - это размер выделенной памяти (поэтому 4 * 10)

Размер указателя не зависит от размера представляемого им типа данных. (На 32-битных платформах указатель 32-битный)

0 голосов
/ 05 мая 2020

Цитируемый вами текст технически неверен. sizeof variable_name действительно возвращает размер памяти, которую занимает переменная с именем variable_name.

Текст делает частую ошибку, объединяя указатель с памятью, на которую он указывает. Это две разные вещи. Если указатель указывает на выделенный блок, то этот блок не выделяется для указателя. (Содержимое блока также не сохраняется в указателе - еще одна распространенная ошибка).

Выделение существует само по себе, переменная-указатель существует где-то еще, а переменная-указатель указывает на выделение. Переменную-указатель можно изменить так, чтобы она указывала на другое место, без нарушения распределения.

0 голосов
/ 05 мая 2020

sizeof возвращает количество байтов

Оператор sizeof возвращает размер (в байтах) его операнда, который может быть выражением или именем типа в скобках.

, но не гарантируется, что размер каждого байта равен 8. Таким образом, вы не получите напрямую объем выделенной памяти.

Байт состоит из непрерывной последовательности битов, количество которых определяется реализацией

, в любом случае вы можете определить объем выделенной памяти с помощью константы CHAR_BIT, которая содержит количество битов в байтах.

0 голосов
/ 05 мая 2020

« Выделение памяти » в C обычно относится к явному выделению (например, в куче - malloc() и другие) или неявному выделению (например, в стеке).

Как вы определили, sizeof() возвращает размер типа данных:

  • sizeof(char) - одиночный char
  • sizeof(void *) - an void указатель

Если вы вызываете malloc(sizeof(int)), вы запрашиваете « достаточно памяти для хранения данных для int», что может быть 4 байта на вашем system ... вы можете обнаружить, что выделено больше памяти, чем вы запрашивали (хотя обычно это будет скрыто от вас, см. canaries ).

Кроме того, если вы позвоните int *x = malloc(1024), и sizeof(*x), вы можете получить 4, потому что int составляет 4 байта ... даже если выделенная вами память составляет 1 КиБ. Если вы неправильно набрали sizeof(x), вы получите размер возвращаемого указателя, а не размер типа, на который он указывает. Ни один из них (sizeof(*x) или sizeof(x)) не вернет 1024.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...