Member 13922884 Ответов: 2

Как ведет себя в случае символьные константы?


тап_п ()
{
Char a='b';
Printf ("%d", sizeof ('b');
Printf ("\n%d", sizeof (a));

}

Выход:
4
1
Почему я должен получать разные выходные данные, хотя я передаю одно и то же значение?

Что я уже пробовал:

Я уже погуглил свой запрос и обнаружил, что C рассматривает символьный литерал как целочисленный тип, следовательно, sizeof ('b')возвращает 4.
Но тут я начинаю путаться. Я передаю одно и то же значение оба раза, но все равно получаю разные значения.

Пожалуйста, проводи меня сюда.
Спасибо.

2 Ответов

Рейтинг:
13

Richard MacCutchan

Чтобы добавить к тому, что сказал OriginalGriff. Хотя и переменная a будет выделено как 4 байта, он был объявлен как a char тип. А так как а char это всего лишь один байт, компилятор возвращает его размер как 1.


Member 13922884

Хорошо. По умолчанию символьный литерал обрабатывается как целое число в C. следовательно, я получаю вывод как 4 в 1-м случае. Во втором случае, поскольку я объявил его как тип данных char, функция sizeof () возвращает его размер как 1 (хотя в памяти он занимает 4 байта).
Поправьте меня, если я ошибаюсь в своем понимании здесь.

Спасибо.

Richard MacCutchan

Да, это верно. То sizeof оператор-это оператор времени компиляции, поэтому он имеет ограниченное применение в большинстве программ.

KarstenK

Var требуется только 1 байт, но система заполняет 3 байта, чтобы соответствовать стандартному размеру 4 байта. Разве это не может быть изменено с помощью #pragma padding?

Richard MacCutchan

Да, но я не думаю, что мы хотим путать новичка с прагмами в этом пункте.

Member 13922884

Хорошо. Спасибо!!

Рейтинг:
10

OriginalGriff

Когда вы выделяете память, она должна быть выделена кратно разумному размеру: блок системной памяти. Для 32-или 64 - битной системы, которая имеет тенденцию быть 32 битами или 4 байтами- потому что это размер выборки / регистра памяти. Если вы выделяете отдельные байты, то это создает проблемы со следующим выделением, которое вы делаете, поскольку оно может быть частично в одной выборке и частично в другой.
Поэтому, когда вы используете символьный литерал типа 'b', он должен храниться где - то в вашей скомпилированной программе, и он хранится как целое число - занимая целую единицу системной памяти-чтобы сделать его проще для каждой вещи. Поэтому, когда вы читаете размер, вы получаете больше, чем ожидали!

В принципе, не беспокойтесь об этом - это не то, что вам нужно будет делать в "реальном мире".