Podczas odpowiadania na komentarz do innej mojej odpowiedzi here, znalazłem, co myślę, że może być dziurą w standardzie C (c1x, nie sprawdziłem wcześniejszych i tak, wiem, że jest nieprawdopodobne, żebym sam wśród wszystkich mieszkańców planety znalazł błąd w standardzie). Informacje są następujące:Potencjalny problem z C standardowymi znakami malloc'ing
- Sekcja 6.5.3.4 ("Operator wielkości") para 2 stwierdza
"The sizeof operator yields the size (in bytes) of its operand"
. - Para 3 tej sekcji stanowi:
"When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1"
. - Sekcja 7.20.3.3 opisuje
void *malloc(size_t sz)
, ale wszystko to mówi:"The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate"
. Nie wspomina wcale o tym, jakie jednostki są używane do argumentacji. - Aneks E zaczyna się od 8 to minimalna wartość dla
CHAR_BIT
, więc znaki mogą mieć więcej niż jeden bajt długości.
Moje pytanie jest po prostu tak:
W środowisku, w którym znak ma szerokość 16 bitów, będzie malloc(10 * sizeof(char))
przeznaczyć 10 znaków (20 bajtów) lub 10 bajtów? Punkt 1 powyżej wydaje się wskazywać na pierwszy, punkt 2 wskazuje na to drugie.
Ktoś, kto ma więcej C-standard-fu niż ja, ma na to odpowiedź?
Właściwie myślę, że możesz go tam mieć. na podstawie Twojej odpowiedzi znalazłem 3.6 (w "Terminy, definicje i symbole") określające "bajt - adresowalną jednostkę pamięci danych wystarczająco dużą, aby pomieścić dowolny element podstawowego zestawu znaków środowiska wykonawczego ... UWAGA 2 - bajt składa się z ciągłej sekwencji bitów, których liczba jest definiowana przez implementację ". – paxdiablo
Cholera, pomyśl o chwale i pochwałach, jakie otrzymałbym za znalezienie problemu w standardzie. No cóż, wracając do codziennej pracy :-) – paxdiablo
Po raz kolejny powtarzam mantrę "Muszę dostać kopię standardów". Dodam twoje standardy do mojej odpowiedzi na kompletność. –