- 1
printf("Aligment control: %d", sizeof(DataTransfer_T));
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+36
printf("Aligment control: %d", sizeof(DataTransfer_T));
LispGovno 02.10.2012 17:11 # +1
Мне интересно, кто первый сможет обнаружить в этом коде серьёзную ошибку.
bormand 02.10.2012 17:15 # +5
sizeof возвращает size_t, а %d принимает int. Эту?
P.S. Alignment
absolut 02.10.2012 17:35 # −3
guest 02.10.2012 18:33 # +2
myaut 02.10.2012 20:37 # +4
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.
Интересно. Честно говоря не знал этого. Автору - плюс!
Stud 02.10.2012 21:46 # −4
bormand 02.10.2012 21:47 # +3
Стандарт 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).
Steve_Brown 03.10.2012 10:33 # +2
И не знаю, хорошо это или плохо, но ошибка вылезет только при портировании на тупоконечную платформу с size_t != unsigned.
bormand 03.10.2012 11:52 # 0
Это 64-битные винда и линуха. У них int 32-битный (причем у винды еще и long 32-битный), а size_t и указатели 64-битные. Так что проблема вылезет быстро, ой как быстро...
defecate-plusplus 03.10.2012 11:55 # 0
надо еще поискать нечто, чей sizeof выдаст 4 гигабайта
bormand 03.10.2012 12:07 # +2
Зачем? Если не туплю - поломается ABI у printf'а. Если я захочу вывести printf("%d %d", sizeof(xxx), yyy) он будет читать 2 32-битных значения. Но при вызове в стек будут запиханы 64-битное и 32-битное, и printf выдаст мусор.
defecate-plusplus 03.10.2012 12:21 # +3
http://ideone.com/gdQ9S
edit: так собственно они и есть :)
bormand 03.10.2012 12:48 # 0
P.S. http://ideone.com/lZFUm
defecate-plusplus 03.10.2012 13:03 # 0
97 98
хотя попросили выудить из стека два unsigned, когда там лежат два байта выводит
bormand 03.10.2012 13:45 # +2
bormand 03.10.2012 15:04 # 0
Steve_Brown 03.10.2012 12:22 # +2
Тупоконечный - я имел в виду big-endian, где взялось бы старшее двойное слово (скорей всего, равное нулю). (надеюсь, не напутал ничего)
LispGovno 03.10.2012 12:10 # +1