5.7k views

Consider the following C declaration:

struct (
short x;
union {
float y;
long z;
} u;
)t;

Assume that the objects of the type short, float and long occupy $2$ bytes, $4$ bytes and $8$ bytes, respectively. The memory requirement for variable $t$, ignoring alignment consideration, is:

1. $22$ bytes
2. $14$ bytes
3. $18$ bytes
4. $10$ bytes

edited | 5.7k views
+1
what is the concept of alignment here..?
what if, we consider the alignment then what will be the answer?
+5
0
thanks for sharing nitish, I am unaware of this.
So, as it is architecture dependent then it means we can not assume the padding by ourself right.
+2
yes it is architecture dependent, but in general machines we take 32bit or 64 bit architecture,

but whenever qsn will be asked machine architecture(word size) will be explicitly mentioned...
+7
In this question if we have to consider the alignment then answers will be like this-

for 32 bit architecture: 2*5 (+2 Byte padding)+8=10+2+8=20Byte

and for 64 bit architecure: 2*5(+6 byte padding)+8=10+6+8=24Byte
0
yes..
0
how you add 2 byte for 32 bit architecture becouse 2^k means 2^5= 32 bit and 2^6=64 bit

..if any other logic here pz explain
0
@reena_kandhari how u have calculated size with alignment conditions. Please explain
0
+8

This might help in understanding Data Alignment more clearly.

+1 18 Bytes

0

@reena_kandari @joshi_nitish can you please explain the padding done for 32 and 64 bit machine?

@Shaik Masthan

0
0

@reena_kandarihow you calculated padding bits for 32 bit and 64 bit architecture

0

Please see the video above posted by Nitesh Singh.you will understand the purpose of padding & how it's done internally.

Here, structure creates the memory for '$\text{array and union}$', but union only creates the memory for only '$\text{long z}$' which is the largest size data type inside it.

Hence,

$short \times  = 5*2 = 10$ bytes  [ shorts take $2$ bytes]

$\text{long z} = 8$ bytes

So, ($10+8) = 18$ bytes

by Active (3.3k points)
edited
+1
+4

That's the worst key in 2015 paper- but 2-3 other ones were also wrong even after 6 were changed in the paper. If they don't care for quality they could hire from GATE only.

+18

@Arjun Sir, Please comment if u find this wrong.

- Because every address has to be in form of $2^k$ for some k (except char). After 10 byes of short data type array, we have to pad 6 bytes to make offset of 16 to next starting address of long.
Which gives
10 + 6 (pading) + 8 = 24.

char can take any address, infact we do padding of characters only. This structure would become like this-

struct (
short x;
union {
float y;
long z;
} u;
)t;

Is it right ?

0
Yes same problem . Can anyone describe it what is the alignment and if it is included how the answer will change ?

#include<stdio.h>
struct {
short x;
union {
float y;
long z;
} u;
}t;
int main() {
printf("short=%d\n",sizeof(short));
printf("float=%d\n",sizeof(float));
printf("long=%d\n",sizeof(long));
printf("%d",sizeof(t));
return 0;
}
ans :16

Short : 2 bytes

float: 4 bytes

double : 4 bytes

Answer should be 14 but how it is 16 ?

@Arjun Sir
0
0
Why union creates only memory for long z??
+6

A union is a class all of whose data members are mapped to the same address within its object. The size of an object of a union is, therefore, the size of its largest data member.

Since longz is the largest data member it will create only for it

https://en.wikipedia.org/wiki/Union_type

0
Thank you so much.
0
since the size of union is the largest data member size, can there be padding at the end?
+1
if we consider alignment answer is 24 bytes :)
0

Structure alignment is implementation-defined. So answer after considering alignment doesn't necessarily need to be 24. Please see "IMPORTANT NOTE" and Comment section of the selected answer:

https://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member

0
@sachin where hav u studied that address alignment part ?? i am not getting it ..  In union , the size of the largest member of the union is the size of the union ... as far i know ..
0
0
Sir, why *UNION* only conside the max?
struct (
short x;
union {
float y;
long z;
} u;
)t;

union considers max value only.

struct (

short x;

8bytes; //long

)t;

struct considers every value

5*2// 5 values of short =8 =>18

by (227 points)
Short=5*2=10

Max[float,long]= max[4,8]=8

Total=short+max[4,8]=10+8=18
by (15 points)

When memory would be assigned for the array

short x;

Memory requirement = $5*2B=10B$

And for

union {
float y;
long z;
}

Memory requirement = $8B$ because the size of a union is the size of it's largest data member.

Hence, total memory requirements = $18B$

Option C

# Let's consider memory alignment now.

If machine architecture has word size = 32 bits, then every piece of addressable memory must be in multiples of a word. Or equivalently 32 bits. Or, equivalently 4B.

Hence for:

short x;

Memory requirement = $5*2B=10B$ $+2B$ of padding = $12B$ (Multiple of 4B)

for:

union {

Memory requirement = $8B$

So, total = $20B$

If machine architecture has word size = 64 bits, then every piece of addressable memory must be in multiples of a word. Or equivalently 64 bits. Or, equivalently 8B.

Hence for:

short x;

Memory requirement = $5*2B=10B$ $+6B$ of padding = $16B$ (Multiple of 8B)

for:

union {

Memory requirement = $8B$

So, total = $24B$

by Loyal (6.6k points)