The Gateway to Computer Science Excellence
First time here? Checkout the FAQ!
x
+25 votes
3.9k 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
asked in Programming by Veteran (59.5k points)
edited by | 3.9k views
+1
what is the concept of alignment here..?
what if, we consider the alignment then what will be the answer?
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
@reena_kandhari how u have calculated size with alignment conditions. Please explain
0
why u r adding  byte padding for 32 bit ?
0

This might help in understanding Data Alignment more clearly.

2 Answers

+41 votes
Best answer

Answer is (C).

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

https://drive.google.com/file/d/0B8_aYGBndW4Hd2JNWDYxYlVpYlU/view

+11

@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];  
    char pad[6];
    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 ..
+2 votes
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 (187 points)


Quick search syntax
tags tag:apple
author user:martin
title title:apple
content content:apple
exclude -tag:apple
force match +apple
views views:100
score score:10
answers answers:2
is accepted isaccepted:true
is closed isclosed:true

39,828 questions
46,802 answers
140,987 comments
58,943 users