C - Найти размер структуры - PullRequest
       5

C - Найти размер структуры

5 голосов
/ 12 сентября 2011

Мне задали это как вопрос для интервью.Не могу ответить.

Напишите программу на C для определения размера структуры без использования оператора sizeof.

Ответы [ 7 ]

12 голосов
/ 12 сентября 2011
struct  XYZ{
    int x;
    float y;
    char z;
};

int main(){
    struct XYZ arr[2];
    int sz = (char*)&arr[1] - (char*)&arr[0];
    printf("%d",sz);
    return 0;
}
4 голосов
/ 12 сентября 2011

Вот другой подход. Он также не полностью определен, но все равно будет работать в большинстве систем.

typedef struct{
    //  stuff
} mystruct;

int main(){
    mystruct x;
    mystruct *p = &x;

    int size = (char*)(p + 1) - (char*)p;
    printf("Size = %d\n",size);

    return 0;
}
1 голос
/ 31 мая 2012

Вот другой подход .... нет необходимости создавать какой-либо экземпляр структуры.

struct  XYZ{
    int x;
    float y;
    char z;
};

int main(){
    int sz = (int) (((struct XYZ *)0) + 1);
    printf("%d",sz);
    return 0;
}

Как это работает?

((struct XYZ *)0) + 1 = zero + size of structure
                      = size of structure
1 голос
/ 12 сентября 2011

Вот две версии макроса для двух форм sizeof (принимает тип против принимает переменную), которые вы можете использовать для всего кода, который вы никогда не напишите, где вам не разрешено использовать sizeof:

#define type_sizeof(t) (size_t)((char *)((t *)1024 + 1) - (char *)((t *)1024))
#define var_sizeof(v)  (size_t)((char *)(&(v) + 1) - (char *)&(v))

Возможно, с помощью некоторой глубокой магии вы можете объединить два в один макрос, который почти послужит заменой всего этого кода, не содержащего sizeof.(Жаль, что вы не можете исправить ошибки множественной оценки.)

0 голосов
/ 22 апреля 2017
struct  ABC

{

int a;

float b;

char c;

};


void main()
{

struct ABC *ptr=(struct ABC *)0;

ptr++;

printf("Size of structure is: %d",*ptr);

}
0 голосов
/ 08 апреля 2015
struct ABC
{
    int a, b[3];
    int c;
    float d;
    char e, f[2];
};
int main()
{
    struct ABC *ptr=(struct ABC *)0;
    clrscr();
    ptr++;
    printf("Size of structure is: %d",ptr);
    return 0;
}
0 голосов
/ 15 сентября 2011

Для людей, которым нравится кодирование в стиле C, вот мое мнение:

#define SIZE_OF_STRUCT(mystruct)     \
   ({ struct nested_##mystruct {     \
         struct mystruct s;          \
         char end[0];                \
      } __attribute__((packed)) var; \
      var.end - (char *)&var; })

void main()
{
   struct mystruct {
      int c;
   };

   printf("size %d\n", SIZE_OF_STRUCT(mystruct));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...