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

Reply via email to