struct padding ???

Discussion in 'C Programming' started by vikas talwar, May 31, 2008.

  1. vikas talwar

    vikas talwar Guest

    Hi All,

    Can you please explain me how the 'C' compiler allocate memory to
    'struct'.
    Please go thu the example below and pls suggest me the solution for my
    problem.

    Here is my structure definition

    struct my_dev {
    char abc;
    } ;

    and now when I do
    printf("size=%d\n", sizeof(struct my_dev));
    output is: 4

    But I expect the size of struct = '1'.

    Is there any trick to get the struct to occupy memory with pad of 1
    byte and not 4 bytes..


    --
    Thanks
    Vikas
     
    vikas talwar, May 31, 2008
    #1
    1. Advertising

  2. vikas talwar <> wrote:
    > Can you please explain me how the 'C' compiler allocate memory to
    > 'struct'.
    > Please go thu the example below and pls suggest me the solution for my
    > problem.


    > Here is my structure definition


    > struct my_dev {
    > char abc;
    > } ;


    > and now when I do
    > printf("size=%d\n", sizeof(struct my_dev));
    > output is: 4


    > But I expect the size of struct = '1'.


    > Is there any trick to get the struct to occupy memory with pad of 1
    > byte and not 4 bytes..


    The compiler is obviously putting in 3 padding bytes after the
    'abc' element of the structure. It does that to make sure when
    you create an array of such structures all the structures of
    the array end up on correctly aligned memory positions. If
    it wouldn't do that something simple as

    my_dev xxx[ 2 ];

    xxx.abc = 'c';

    could lead to a crash of the program, at least on your machine
    (on mine the sizeof for the structure is repoted as 1, so on
    my machine it doesn't seem necessary to insert padding bytes).
    For the same reason also padding bytes can appear between the
    elements of a structure.

    There is no C standard compliant way to elimintae padding bytes.
    Some compilers have some extra options to avoid the addition of
    padding bytes, for e.g. gcc you would have to add

    __attribute__((packed))

    directly after the structure declaration) but, unless you know
    exactky what you're doing and the trouble you can get into with
    that I can only recommend not to use it. Perhaps you should
    tell what exactly you want to achieve that would require the
    elimination of padding bytes and perhaps there's a better way
    to do it.
    Regards, Jens
    --
    \ Jens Thoms Toerring ___
    \__________________________ http://toerring.de
     
    Jens Thoms Toerring, May 31, 2008
    #2
    1. Advertising

  3. Jens Thoms Toerring <> wrote:
    > ....it wouldn't do that something simple as


    > my_dev xxx[ 2 ];


    > xxx.abc = 'c';


    Sorry, I meant

    xxx[1].abc = 'c'

    here, the original version would be a syntax error...

    Regards, Jens
    --
    \ Jens Thoms Toerring ___
    \__________________________ http://toerring.de
     
    Jens Thoms Toerring, May 31, 2008
    #3
  4. (Jens Thoms Toerring) writes:
    > vikas talwar <> wrote:
    >> Can you please explain me how the 'C' compiler allocate memory to
    >> 'struct'.
    >> Please go thu the example below and pls suggest me the solution for my
    >> problem.

    >
    >> Here is my structure definition

    >
    >> struct my_dev {
    >> char abc;
    >> } ;

    >
    >> and now when I do
    >> printf("size=%d\n", sizeof(struct my_dev));
    >> output is: 4

    >
    >> But I expect the size of struct = '1'.

    >
    >> Is there any trick to get the struct to occupy memory with pad of 1
    >> byte and not 4 bytes..


    See questions 2.12 and 2.13 in the comp.lang.c FAQ,
    <http://www.c-faq.com/>.

    > The compiler is obviously putting in 3 padding bytes after the
    > 'abc' element of the structure. It does that to make sure when
    > you create an array of such structures all the structures of
    > the array end up on correctly aligned memory positions. If
    > it wouldn't do that something simple as
    >
    > my_dev xxx[ 2 ];
    >
    > xxx.abc = 'c';
    >
    > could lead to a crash of the program, at least on your machine
    > (on mine the sizeof for the structure is repoted as 1, so on
    > my machine it doesn't seem necessary to insert padding bytes).
    > For the same reason also padding bytes can appear between the
    > elements of a structure.


    Actually, I can't think of any good reason why the compiler *needs* to
    pad "struct my_dev" to 4 bytes. It *could* internally treat a
    structure with a single member the same way it would treat an object
    of the member type.

    There is a requirement for all pointers to structures to have the same
    representation; on an implementation where byte pointers and word
    pointers are represented differently, that could force 4-byte
    alignment for all structures, even small ones. But most systems use
    the same representation for all pointers.

    Probably the compiler's developers decided that it would be simpler to
    force all structures to be word-aligned (where a "word" is probably 4
    bytes). They're allowed to do that. The standard allows padding
    after members of structures; it doesn't require that padding to be the
    minimum necessary. A perverse implementation could add as much
    padding as it likes, for no good reason at all.

    [...]

    For your particular problem, why do you need a structure at all?
    Rather than
    struct my_dev {
    char abc;
    };
    why not just use type char directly (with a typedef if you like)?
    (Using a structure does have the advantage of type safety; "struct
    my_dev" is incompatible with other types. But then you have to pay
    the price of letting the compiler add extra padding.)

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    Nokia
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
     
    Keith Thompson, May 31, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chris Fogelklou
    Replies:
    36
    Views:
    1,440
    Chris Fogelklou
    Apr 20, 2004
  2. edware

    struct padding

    edware, Apr 25, 2006, in forum: C Programming
    Replies:
    9
    Views:
    451
    Ed Vogel
    Apr 27, 2006
  3. Hallvard B Furuseth

    Padding bits and struct assignment

    Hallvard B Furuseth, Dec 27, 2006, in forum: C Programming
    Replies:
    5
    Views:
    689
    Eric Sosman
    Dec 27, 2006
  4. Replies:
    11
    Views:
    896
  5. Replies:
    13
    Views:
    381
    glen herrmannsfeldt
    May 5, 2013
Loading...

Share This Page