При ответе на комментарий к другому моему ответу here, я нашел то, что думаю может быть отверстием в стандарте C (c1x, я не проверял ранее и да, я знаю, что невероятно маловероятно, что я один среди всех жителей планеты обнаружил ошибку в стандарте). Ниже следует информация:Потенциальная проблема с C стандартными символами malloc'ing
- Раздел 6.5.3.4 («Оператор размера»), пункт 2, устанавливает
"The sizeof operator yields the size (in bytes) of its operand"
. - В параграфе 3 этого раздела говорится:
"When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1"
. - Раздел 7.20.3.3 описывает
void *malloc(size_t sz)
, но все, что он говорит, это"The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate"
. В нем нет никаких упоминаний о том, какие единицы используются для аргументации. - Приложение E запускает 8: минимальное значение значение для
CHAR_BIT
, поэтому символы могут быть более одного байта в длину.
Мой вопрос просто:
В среде, где символ имеет ширину 16 бит, будет malloc(10 * sizeof(char))
выделить 10 символов (20 байт) или 10 байтов? Точка 1 выше, по-видимому, указывает на первую, точка 2 указывает на последнюю.
У кого-нибудь, у кого больше C-standard-fu, чем у меня есть ответ на этот вопрос?
На самом деле, я думаю, вы можете иметь его там. основанный на вашем ответе, я нашел 3.6 (в «Терминах, определениях и символах»), указав «байтовый адресный блок хранения данных, достаточно большой, чтобы удерживать любого члена базового набора символов среды выполнения ... ПРИМЕЧАНИЕ 2 - Байт состоит из непрерывной последовательности бит, число которой определяется реализацией ». – paxdiablo
Черт, подумайте о славе и похвалах, которые я получил бы за то, что нашел проблему в стандарте. Хорошо, вернемся к работе :-) – paxdiablo
Еще раз, я нахожу себе повторение «Я должен получить копию стандарта» мантры. Я добавлю вашу стандартную цитату к моему ответу за полноту. –