Difference between Unions and Structures...

R

Ravikiran

Hi,

I want know the differences between Unions and Structures in C
programming.

Thank you..
 
P

Pawel Dziepak

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
I want know the differences between Unions and Structures in C
programming.

The size of union is the size of its largest member. In most
implementations (but standard does *not* require it) all members of
union are placed at the same location in memory.
Structures are just "normal" groups of variables.

Pawel Dziepak

PS I really shouldn't help you that way, there is a lot of information
about structures and unions in many FAQs, articles, etc.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iEYEARECAAYFAkkO3r4ACgkQPFW+cUiIHNp5SwCgsATEiHUwMyAd4dGgVJQQAUR2
MCoAn1+6G5wqv5h6JBxjP3x++K5SDBLT
=z5G+
-----END PGP SIGNATURE-----
 
M

Martien Verbruggen

The size of union is the size of its largest member. In most
implementations (but standard does *not* require it) all members of
union are placed at the same location in memory.

From 6.2.5 - 20

— A union type describes an overlapping nonempty set of member
objects, each of which has an optionally specified name and possibly
distinct type.

Also, from 6.5.8 - 5

All pointers to members of the same union object compare equal.

I'd say that pretty much gurantees that the members of a union, as you
say it, are placed at the same location in memory.

Martien

PS. quotes from n1256. Wording in actual c99 standard is identical. I
don't own a c89 copy, but in a draft for that standard, similar ior
identical wording for the above quoted is present
 
G

gk

From 6.2.5 - 20

  — A union type describes an overlapping nonempty set of member
    objects, each of which has an optionally specified name and possibly
    distinct type.

Also, from 6.5.8 - 5

  All pointers to members of the same union object compare equal.

I'd say that pretty much gurantees that the members of a union, as you
say it, are placed at the same location in memory.

Martien

PS. quotes from n1256. Wording in actual c99 standard is identical. I
don't own a c89 copy, but in a draft for that standard, similar ior
identical wording for the above quoted is present

--
                        |
Martien Verbruggen      | Since light travels faster than sound, is
                        | that why some people appear bright until you
                        | hear them speak?

the difference basically arises in the memory allocation.....while
structure allocates memory separately to each of its members, the same
is not the case with unions..it allocates memory only to the largest
available member...the rest of them are allocated within this block of
memory only
 
P

Pawel Dziepak

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Martien said:
I'd say that pretty much gurantees that the members of a union, as you
say it, are placed at the same location in memory.

Sorry, it was my fault. I heard that the location can be different, but
I didn't check that. Anyway, sorry for providing incorrect information.

Pawel Dziepak
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iEYEARECAAYFAkkPB1cACgkQPFW+cUiIHNpcSgCeMdASw61Y1oIZvce1+NR12WXA
xcsAn0jYzPyCUAKQsZmOnjbQydXs0M2P
=xpZ8
-----END PGP SIGNATURE-----
 
J

James Kuyper

gk wrote:
....
the difference basically arises in the memory allocation.....while
structure allocates memory separately to each of its members, the same
is not the case with unions..it allocates memory only to the largest
available member...the rest of them are allocated within this block of
memory only

The standard does not prohibit a union from having a size significantly
bigger than the size of its largest member. In some cases, it's a
practical necessity that the size be larger than that.

On systems where alignment matters, in order for a union to ensure
correct alignment for any given member, the union itself must have an
alignment requirement that is a multiple of the alignment requirement of
that members. Since this must apply to all members at the same time, it
must be a common multiple of all of those requirements. There's obvious
reasons to preference the least common multiple, but that's not required
by the standard. On most systems, where all alignment requirements are
powers of 2, the least common multiple of the alignment requirements of
the members of the union is the same as the largest alignment
requirement; but on a hypothetical system where long has an alignment
requirement of 3, and double has an alignment requirement of 5, a union
that contains both must have a alignment requirement of at least 15.

The size of any object must be a multiple of its alignment requirement,
otherwise a contiguous array of such objects could not all be correctly
aligned.

The net result of this is that the size of a union could be quite a bit
larger than the size of it's largest member. Just consider a simple
case, where double has an alignment requirement of 8. Then the following
union:

union dcarr{
double d;
char carr[9];
};

would have to have a size that is at least 9 bytes, and also a multiple
of 8 bytes. The smallest size meeting both requirements is 16 bytes.
 
K

Keith Thompson

Ravikiran said:
I want know the differences between Unions and Structures in C
programming.

If your textbook doesn't explain this clearly, you need a new
textbook. I recommend K&R2 (Kernighan & Ritchie, The C Programming
Language, 2nd Edition).
 
C

CBFalconer

Ravikiran said:
I want know the differences between Unions and Structures in C
programming.

Try the C standard. For example:

6.7.2.1 Structure and union specifiers

...

Semantics

[#4] As discussed in 6.2.5, a structure is a type consisting
of a sequence of members, whose storage is allocated in an
ordered sequence, and a union is a type consisting of a
sequence of members whose storage overlap.

and a good deal more.

Some useful references about C:
<http://www.ungerhu.com/jxh/clc.welcome.txt>
<http://c-faq.com/> (C-faq)
<http://benpfaff.org/writings/clc/off-topic.html>
<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf> (C99)
<http://cbfalconer.home.att.net/download/n869_txt.bz2> (pre-C99)
<http://www.dinkumware.com/c99.aspx> (C-library}
<http://gcc.gnu.org/onlinedocs/> (GNU docs)
<http://clc-wiki.net/wiki/C_community:comp.lang.c:Introduction>
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top