4.3k 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 | 4.3k views
+1
what is the concept of alignment here..?
what if, we consider the alignment then what will be the answer?
+4
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.
+1
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...
+4
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
+1
0
@reena_kandhari how u have calculated size with alignment conditions. Please explain
0
why u r adding  byte padding for 32 bit ?
+2

This might help in understanding Data Alignment more clearly.

0

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

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

answered by Active (3.3k points)
edited
0
ISRO answer key given option C. totally wrong. anyone also not argue with this. someone loose 3 marks easily. who care about it. please download answer key  and verify it.
+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.

+13

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

If we dont ignore address alignment, then answer is 24 ?
- 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
Can you please tell me if your procedure is correct?
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

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
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

answered by (227 points)

1
2