Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

typecasting bigger or smaller structure in C

I have two structures in C program: SmallStructABC and BigStructXYZ

I have several members in both of them; SmallStructABC's all 10 members are exactly same as first 10 members of BigStructXYZ. BigStructXYZ has 50 additional members.

Is it OK to type-cast this two structures to each other?

SmallStructABC *i = (BigStructXYZ*)j;
BigStructXYZ   *a = (SmallStructABC*)b; 

I only access first 10 (common) members after type-casting..

I wrote C program and its working fine on my machine. Just wanted to verify if I need to take care of any corner cases (alignment, invalid read, non-gcc compilation etc)..

EDIT: Q: Why I want to do something like this?

A: BigStructXYZ is very big in size (say 50KB) and contains some header (keys, map etc). I compress this data before sending over network. I leave header (in our case its SmallStructABC) as it is. By doing type-cast, I can access these keys from header as and when required.

like image 750
Jack Avatar asked Nov 21 '25 04:11

Jack


2 Answers

No, this is not a good idea. Much better would be to type cast pointers to the structures and manipulate them through the pointers:

void DoSomething(Small *thing) {
    // ...
}

int main() {
    Big big = {0};
    Small small = {0};

    Small *p0 = (Small*)&big;
    Small *p1 = &small;

    DoSomething(p0);
    DoSomething(p1);

    return 0;
}

An alternative and safer design is to define Big in terms of Small:

typedef struct Small {
    int foo;
};
typedef struct Big {
    Small small;
    int y;
};
like image 84
Frank Krueger Avatar answered Nov 23 '25 22:11

Frank Krueger


The code above won't compile. Is j already a BigStructXYZ, and did you mean to cast it to SmallStructABC?

Whatever the case, what you're trying to do is a bad idea. It would be better to have SmallStructXYZ as the first field inside BigStructXYZ and work thus:

SmallStructABC i = j.smallStruct;
BigStructXYZ a = { b };
like image 40
Marcelo Cantos Avatar answered Nov 23 '25 21:11

Marcelo Cantos



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!