Потенциальная проблема со стандартом C malloc'ing символы

Я знаю, что это старый пост, и я могу что-то упустить, но кажется, что все здесь упустили реальный ответ. Если вы хотите иметь один сертификат, который работает на нескольких серверах с использованием нескольких имен хостов / доменов, вам просто нужно купить сертификат SAN. Мы делаем это все время на работе ...

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

3 ответа

В 16-битной char среде malloc (10 * sizeof (char)) выделит 10 char s (10 байтов), потому что, если char составляет 16 бит, то эта архитектура / реализация определяет байт как 16 бит. char не октет, а байт. На старых компьютерах он может быть больше 8-битного фактического стандарта, который мы имеем сегодня.

Соответствующий раздел из стандарта C следует:

3.6 Термины, определения и символы

байт - адресуемая единица хранения данных, достаточно большая, чтобы вместить любой член основного набора символов среды выполнения ...

ПРИМЕЧАНИЕ 2. - Байт состоит из непрерывной последовательности битов, количество которых определяется реализацией.

16
ответ дан 6 December 2019 в 10:01
поделиться

В стандарте C99 строгая корреляция между байтами, char и размером объекта дана в 6.2.6.1/4 «Представления типов - Общие»:

Значения, хранящиеся в объектах без битовых полей любого другого типа объекта, состоят из n × CHAR_BIT бит, где n - размер объекта этого типа в байтах. Значение может быть скопировано в объект типа unsigned char [n] (например, с помощью memcpy); результирующий набор байтов называется объектным представлением значения.

В стандарте C ++ такое же отношение дается в 3.9 / 2 «Типы»:

Для любого объекта (кроме подобъекта базового класса) из POD типа T, независимо от того, содержит ли объект допустимое значение типа T, базовые байты (1. 7) составляющий объект можно скопировать в массив char или unsigned char. Если содержимое массива char или unsigned char копируется обратно в объект, объект впоследствии должен сохранить свое исходное значение.

В C90, похоже, не существует такой явно упомянутой корреляции, но между определением a byte, определение символа и определение оператора sizeof , можно сделать вывод, что тип char эквивалентен байту.

Также обратите внимание, что число Количество битов в байте (а количество битов в char ) определяется реализацией - строго говоря, это не обязательно должно быть 8 бит. И onebyone указывает в комментарии в другом месте, что DSP обычно имеют байты с числом бит, отличным от 8.

2
ответ дан 6 December 2019 в 10:01
поделиться

Разве единицы "size_t sz" не входят в адресную единицу вашей архитектуры? Я работаю с DSP, адреса которого соответствуют 32-битным значениям, а не байтам. malloc (1) получает указатель на 4-байтовую область.

1
ответ дан 6 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

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