- 1
printf("Aligment control: %d", sizeof(DataTransfer_T));
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+36
printf("Aligment control: %d", sizeof(DataTransfer_T));
Мне интересно, кто первый сможет обнаружить в этом коде серьёзную ошибку.
sizeof возвращает size_t, а %d принимает int. Эту?
P.S. Alignment
z
Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
size_t or the corresponding signed integer type argument; or that a
following n conversion specifier applies to a pointer to a signed integer type
corresponding to size_t argument.
Интересно. Честно говоря не знал этого. Автору - плюс!
Стандарт C89, 6.5.3.4 The sizeof operator
4. The value of the result is implementation-defined, and its type (an unsigned integer type) is size_t, defined in <stddef.h> (and other headers).
И не знаю, хорошо это или плохо, но ошибка вылезет только при портировании на тупоконечную платформу с size_t != unsigned.
Это 64-битные винда и линуха. У них int 32-битный (причем у винды еще и long 32-битный), а size_t и указатели 64-битные. Так что проблема вылезет быстро, ой как быстро...
надо еще поискать нечто, чей sizeof выдаст 4 гигабайта
Зачем? Если не туплю - поломается ABI у printf'а. Если я захочу вывести printf("%d %d", sizeof(xxx), yyy) он будет читать 2 32-битных значения. Но при вызове в стек будут запиханы 64-битное и 32-битное, и printf выдаст мусор.
http://ideone.com/gdQ9S
edit: так собственно они и есть :)
P.S. http://ideone.com/lZFUm
97 98
хотя попросили выудить из стека два unsigned, когда там лежат два байта выводит
Тупоконечный - я имел в виду big-endian, где взялось бы старшее двойное слово (скорей всего, равное нулю). (надеюсь, не напутал ничего)