[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: а кто C хорошо знает?



Victor Wagner <vitus@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:  freehck@jabber.mipt.ru   *
*   Registered linux user #546240    *
**************************************


Reply to: