Символьные массивы в стиле C - Сколько байтов мы храним? - PullRequest
4 голосов
/ 09 августа 2010
char firstName[32];

Я понимаю, что каждый символ занимает 1 байт в памяти.Так что же это занимает 32 байта памяти?

Мне не хватает указателя, который тоже занимает память, или это всего лишь 32 байта?

Ответы [ 7 ]

11 голосов
/ 09 августа 2010

Нет, это занимает ровно 32 байта памяти. Нет указателя.

Это часто является областью путаницы, поскольку имя массива молча "распадается" на "char *"

char* fname = firstName;

Итак, firstName может иметь тип const char*, но сам по себе не является переменной char *. Это в точности как:

 int x = 5;

x является переменной типа int и занимает место. 5, с другой стороны, это просто постоянное значение типа int. Это не занимает места; это просто значение.

2 голосов
/ 09 августа 2010

Он занимает ровно 32 байта памяти. Внутренне все адреса. Переменные только для нашего понимания.

1 голос
/ 09 августа 2010

Оператор char firstName[32] создает массив из 32 символов или 32 байта в стеке .Поскольку он находится в стеке, компилятор точно знает, где он находится относительно указателя стека.Компилятор жестко закодирует адрес массива в любых операциях, которые его используют;нет необходимости хранить указатель на него.

Важно отметить, что если вы попытаетесь передать этот массив в качестве аргумента функции, он будет преобразован в указатель на массив, потому чтоC ++ не позволяет передавать примитивные массивы по значению.Большинство новичков в C ++ ожидают, что он передаст копию массива.

1 голос
/ 09 августа 2010

Это занимает 32 байта. Он будет содержать 31-символьную строку (другой байт для завершения строки с нулевой строкой).

1 голос
/ 09 августа 2010

Это всего 32 байта.Имя массива иногда действует как указатель на первый элемент, но не является указателем.

0 голосов
/ 25 января 2018

Есть два способа хранения данных, например 32 байта.Разница в этих двух версиях:

// version 1
char *firstName = new char[32];

// version 2
char firstName[32];

заключается в том, что для версии 1 пространство, в котором ваши данные распределены в heap , необходимо освободить до завершения программы, тогда как в версии 2место в стеке .И то и другое даст вам переменную, которая указывает на первый байт доступного пространства, и в обоих случаях это пространство составляет 32 байта.Люди будут утверждать, что есть причины, по которым вы можете выбрать один из них , но это другая история.

sizeof (firstName)

Интересным моментом является то, что sizeof вернет, и это размер указателя на символ (зависит от вашей системы и компилятора) для версии 1 и 32 для версии 2. Имейте в виду, что упоминал другой пользователь, передавая firstName функция превращает ее в указатель.

0 голосов
/ 09 августа 2010

В отладочной версии есть также байты, хранящиеся за пределами массива (на некоторых компиляторах) для проверки записи после массива.В версии выпуска это должно быть 32 байта плюс один int в стеке (вероятно) для хранения адреса.

...