Victor Wagner <vi...@wagner.pp.ru> writes: > On 2012.10.08 at 12:41:05 +0400, Dmitry E. Oboukhov wrote: > >> а вот если появилась необходимость саллоцировать такой объект >> статически, как быть? > > Завести union. С первым вариантом struct something и вторым - массивом > требуемой длины. (учитывая sizeof(struct something).
Элегантность этого решения настолько впечатлила меня, что я даже озаботился написанием примера. Вот он: --------------- trick.c --------------- 1 2 #include <stdio.h> 3 4 struct base 5 { 6 int count; 7 int str[0]; 8 }; 9 10 int main(int argc, char** argv) 11 { 12 int c; 13 printf("Input length> "); 14 scanf("%d",&c); 15 16 union 17 { 18 struct base body; 19 int str[sizeof(struct base)+c]; 20 } object; 21 22 object.body.count = c; 23 24 for (int i=0; i<object.body.count; i++) 25 { 26 object.body.str[i] = c - i; 27 } 28 29 for (int i=0; i<object.body.count; i++) 30 { 31 printf("object.body.str[%d] = %d\n",i,object.body.str[i]); 32 } 33 34 printf("sizeof(struct base) = %d\n",(int)sizeof(struct base)); 35 printf("sizeof(int) = %d\n",(int)sizeof(int)); 36 37 return 0; 38 } 39 --------------------------------------- Компиляция и работа: --------------------------------------- % c99 trick.c -o trick % ./trick Input length> 3 object.body.str[0] = 3 object.body.str[1] = 2 object.body.str[2] = 1 sizeof(struct base) = 4 sizeof(int) = 4 % --------------------------------------- Замечу, что в книге Кернигана и Ритчи "Язык программирования Си" подобных фишек не описывалось. Виктор, Вы не подскажете, где можно почитать о подобных трюках? -- ************************************** * jabber: free...@jabber.mipt.ru * * Registered linux user #546240 * ************************************** -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87r4p9nqp2....@ws00.freehck.ru