Как узнать размер структуры, приведенной к пустому указателю в C? - PullRequest
0 голосов
/ 11 сентября 2018

В моем коде есть 2 типа, которые ссылаются на структуру:
TypeX и typeX .

TypeX является пустым указателем, а typeX является структурным типом.
После выделения памяти для переменной typeX я передал ее (приведенный) вПеременная TypeX (или указатель void).

Я хочу получить размер следующей структуры, приведенной к указателю void:

Код

#include <stdio.h>
#include <stdlib.h>

struct _typeX {  
    double a;  
    double b;  
};  

typedef struct _typeX typeX;
typedef void* TypeX;

int main(int argc, char const *argv[]) {  
    TypeX t = NULL;  
    typeX *t0 = NULL;

    t0 = (typeX *) calloc(1, sizeof(typeX));

    t0->a = 123;
    t0->b = 456;

    t = (TypeX) t0;

    printf("%lu\n", sizeof(*t0));
    printf("%lu\n", sizeof(*t));

    free(t);

    return 0;  
}  

Но размер структуры и размер указателя void различаются:

Вывод

16
1

Есть ли способ правильно определить размер структуры, передав указатель void в качестве параметра

1 Ответ

0 голосов
/ 11 сентября 2018

Во-первых, наличие как typeX, так и TypeX, но с очень разными значениями, очень запутанно.Также не скрывайте указатели за typedefs.

Что касается вашего вопроса: Нет, вы не можете восстановить размер объекта, на который указывает t.

sizeof EXPR дает вамразмер типа EXPR (в байтах).Не имеет значения, что является фактическим значением (на самом деле EXPR даже не оценивается 1 ).

Рассмотрим

char c;
int i;
double d[100];

TypeX p1 = (TypeX)&c, p2 = (TypeX)&i, p3 = (TypeX)d;

Все из p1,p2, p3 имеют одинаковый тип, поэтому sizeof вернет одинаковое значение для всех них, даже если объекты, на которые они указывают, имеют очень разные размеры.

Наконец, sizeof (void) не является стандартом C. GCC допускает его как расширение (и возвращает 1), но предупредит вас, что это нестандартно, если вы включите диагностику -pedantic.

1 - С одним относительно неясным исключением, которое я просто проигнорирую.

...