3.7k views

Consider the following C declaration:

struct (
short x[5];
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 | 3.7k views
+1
what is the concept of alignment here..?
what if, we consider the alignment then what will be the answer?
+2
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.
0
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...
+3
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
0
@reena_kandhari how u have calculated size with alignment conditions. Please explain
0
0
how you add 2 Byte for 32bit???plz explain me and also why we  are adding long size i.e 8 ???

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] = 5*2 = 10$ bytes  [ shorts take $2$ bytes]

$\text{long z} = 8$ bytes

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

edited
0
+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.

+11

@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[5];
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[5];
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??
+4

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

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

union considers max value only.

struct (

short x[5];

8bytes; //long

)t;

struct considers every value

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