Tag: Structures in C

  • Structure and union interview questions in c : Master Practice Set #1

    Prepare for technical interviews with our Structure and union interview questions in C practice set. This guide covers memory allocation, padding, arrays in structures and unions, differences, and real-world examples. Ideal for beginners and embedded systems developers to master structures and unions concepts with detailed explanations and practice exercises.

    If you are preparing for a C programming interview, understanding structures and unions is essential. These user-defined data types allow you to group different types of data under a single name, making your programs organized and memory-efficient.

    This practice set #1 contains commonly asked questions on structures and unions in C along with detailed explanations. Whether you are a beginner or brushing up your C skills for interviews, this guide will help you gain confidence.

    Why Structures and Unions Are Important in C?

    • Structures are used to group different data types together to represent a real-world object.
    • Unions are used to store different data types in the same memory location, saving memory.
    • Both are widely asked in technical interviews, especially in embedded systems, data structures, and low-level programming roles.

    Pro Tip: Interviewers often ask differences, memory allocation, and practical use cases.

    A structure in C is a user-defined data type that allows you to group variables of different data types under a single name.
    It is used when you need to represent a complex object with multiple attributes.

    Definition

    A structure is declared using the keyword struct.

    Syntax

    struct structure_name {
        data_type member1;
        data_type member2;
        ...
    };
    

    Example

    struct Student {
        int roll;
        float marks;
        char name[20];
    };
    

    Here:

    • roll → integer
    • marks → float
    • name → character array

    All combined into one unit called Student.

    Why do we use structures?

    NeedDescription
    Grouping different data typesLike name, age, salary together
    Represents real-world objectsLike employee, car, product
    Easier data handlingEspecially in arrays of structures
    Used in embedded systemsRegisters, packets, device configs

    How to declare and access structure variables?

    Declaring

    struct Student s1;

    Accessing members

    s1.roll = 101;
    s1.marks = 89.5;
    strcpy(s1.name, "Jos");

    Memory Concept

    A structure stores its members in sequence, but compiler may add padding to follow alignment rules

    A union in C is a user-defined data type similar to a structure, but with one important difference:

    All members of a union share the same memory location.
    So the size of a union = size of its largest member.

    Definition

    A union is declared using the keyword union.

    Syntax

    union union_name {
        data_type member1;
        data_type member2;
        ...
    };
    

    Example

    union Data {
        int i;
        float f;
        char ch;
    };
    

    Here, i, f, and ch all use the same memory.

    Key Concept: Shared Memory

    Only one member holds a valid value at a time.

    For example:

    union Data d;
    d.i = 10;
    d.f = 20.5;
    

    When you assign f, it overwrites the memory that was holding i.

    Memory Allocation

    If members are:

    • int → 4 bytes
    • float → 4 bytes
    • char → 1 byte

    Union size = 4 bytes (max size).

    Union vs Structure

    FeatureStructureUnion
    MemoryEach member has its own memoryAll members share one memory
    SizeSum of all membersSize of largest member
    Use caseStore multiple valuesAccess different data types in same memory
    Member validityAll members valid at onceOnly one member valid at a time

    Where is a union used?

    Common in embedded systems:

    • Memory-critical applications
    • Interpreting the same memory as different data types

    (e.g., byte-wise access to registers or network packets)

    Example:

    union Packet {
        int full;
        char byte[4];
    };
    

    Structures and unions are both user-defined data types in C, but they differ mainly in memory allocation and usage behavior.

    1. Memory Allocation

    Structure

    • Each member gets its own memory.
    • Total size = sum of all members (with padding).

    Union

    • All members share the same memory.
    • Total size = size of the largest member.

    Example:
    If you have int (4B) + float (4B) + char (1B):

    • Structure size ≈ 9–12 bytes (due to padding)
    • Union size = 4 bytes

    2. Member Storage Behavior

    Structure

    • All members hold values independently.
      You can use all at the same time.

    Union

    • Only one member holds a valid value at a time.
      Writing to one member overwrites others.

    3. Memory Efficiency

    Structure → Not memory efficient

    Union → Highly memory efficient

    Used in embedded systems where memory is limited.

    4. Use Case

    Structure

    Used when you need to store multiple attributes together.

    Examples:

    • Employee record
    • Student record
    • Configuration parameters

    Union

    Used when you want to interpret the same memory in different ways.

    Examples:

    • Hardware register access
    • Protocol packets
    • Memory-saving applications
    • Type punning

    5. Initialization

    Structure

    • Can initialize multiple members at once.

    Union

    • Can initialize only one member at a time.

    Tabular Difference (Easy to Remember)

    FeatureStructureUnion
    MemoryEach member has its own memoryShared memory
    SizeSum of all membersSize of largest member
    Member validityAll members validOnly one valid at a time
    Use caseMultiple attributesMemory sharing / reinterpretation
    AccessNo overwritingOverwrites other members
    EfficiencyLess efficientVery efficient
    InitializationMultiple membersOnly one member

    Memory allocation in a structure in C follows a very specific and important rule:

    Memory in a Structure = Sequential allocation + Alignment + Padding

    Let’s break it down clearly.

    1. Members are stored in sequence

    Structure members are stored in the same order as they are declared.

    Example:

    struct A {
        char c;     // 1 byte
        int x;      // 4 bytes
        char d;     // 1 byte
    };
    

    Memory layout (conceptually):

    [c][padding][padding][padding][x x x x][d][padding][padding][padding]
    

    2. Alignment requirement

    Each data type must be stored at an address that is a multiple of its alignment boundary.

    Common alignments:

    • char → 1 byte
    • short → 2 bytes
    • int → 4 bytes
    • float → 4 bytes
    • double → 8 bytes (on many systems)

    3. Padding is added automatically

    Padding bytes are inserted to ensure alignment of next members.

    Example with Detailed Memory Calculation

    Structure:

    struct A {
        char c;     // 1 byte
        int x;      // 4 bytes
        char d;     // 1 byte
    };
    

    Step-by-step memory allocation:

    Member 1: char c

    • Size = 1 byte
    • Stored at offset 0

    Padding before next member

    Next member = int
    int needs 4-byte alignment
    Current offset = 1
    Next multiple of 4 = 4
    So compiler inserts 3 bytes padding

    Member 2: int x

    • Stored at offset 4 → 7
    • Size = 4 bytes

    Member 3: char d

    • Stored at offset 8
    • Size = 1 byte

    Padding at the end (structure alignment)

    Structure must be aligned to the size of its largest member (here, 4 bytes).
    Current size = 9 bytes
    Next multiple of 4 = 12
    So compiler adds 3 bytes padding at end.

    Final Structure Size = 12 bytes

    General Rules of Structure Memory Allocation

    • Members follow declared order
    • Compiler inserts padding between members
    • Compiler may insert padding at the end
    • Structure size = Next multiple of largest member alignment

    Important Interview Point

    Structure padding and alignment are compiler-dependent, but this is how GCC/Clang commonly work.

    Memory allocation in a union is quite different from a structure. Let’s break it down carefully.

    Key Concept of Union Memory Allocation

    • All members of a union share the same memory location.
    • Size of a union = size of its largest member (plus any padding needed for alignment).
    • Only one member can hold a valid value at a time.

    Example

    union Data {
        int i;      // 4 bytes
        float f;    // 4 bytes
        char ch;    // 1 byte
    };
    

    Step-by-step Memory Allocation

    1. Member int i → needs 4 bytes
    2. Member float f → also 4 bytes
    3. Member char ch → 1 byte

    All members share the same memory:

    | i (4B) / f (4B) / ch (1B) |
    
    • Total union size = 4 bytes (size of largest member)
    • Accessing ch overwrites the same memory that i or f uses.

    Rules of Union Memory Allocation

    1. Shared Memory: All members occupy the same memory block.
    2. Size = Largest Member: Compiler calculates the union size based on the largest member, plus padding for alignment if needed.
    3. Single Valid Member: At any time, only one member can hold meaningful data.
    4. Alignment Rules Apply: Memory alignment rules are followed for the largest member.

    Example in Action

    union Data d;
    
    d.i = 100;       // store int
    printf("%d", d.i);  // 100
    d.f = 10.5;      // store float, overwrites int
    printf("%d", d.i);  // undefined, memory overwritten
    

    Difference with Structure

    FeatureStructureUnion
    MemoryEach member has its own memoryAll members share same memory
    SizeSum of all membersSize of largest member
    Member validityAll members validOnly one member valid

    Yes, we can declare arrays inside a structure in C. In fact, arrays are commonly used as structure members to store multiple values under a single field.

    Syntax

    struct StructureName {
        data_type array_name[array_size];
        // other members
    };
    

    Example 1: Array of integers inside a structure

    #include <stdio.h>
    
    struct Student {
        char name[20];   // character array
        int marks[5];    // integer array
    };
    
    int main() {
        struct Student s1;
    
        // Assigning values
        strcpy(s1.name, "Nish");
        s1.marks[0] = 85;
        s1.marks[1] = 90;
        s1.marks[2] = 75;
        s1.marks[3] = 88;
        s1.marks[4] = 92;
    
        // Printing values
        printf("Name: %s\n", s1.name);
        printf("Marks: ");
        for(int i=0; i<5; i++)
            printf("%d ", s1.marks[i]);
    
        return 0;
    }
    

    Output:

    Name: Nish
    Marks: 85 90 75 88 92
    

    Example 2: 2D array inside a structure

    struct Matrix {
        int mat[3][3]; // 3x3 matrix
    };
    

    Memory Consideration

    • Array inside a structure occupies contiguous memory like a normal array.
    • If the structure has other members, padding may be added for alignment.
    • You can also have arrays of structures, which is common in embedded systems and data handling.

    Example 3: Array of structures

    struct Student students[3];  // Array of 3 Student structures
    

    Memory Allocation for Arrays Inside a Structure

    When you declare an array inside a structure, the array occupies contiguous memory just like a normal array.

    Example:

    struct Student {
        char name[10];  // char array
        int marks[5];   // int array
    };
    

    Memory Allocation:

    • name[10] → 10 bytes (assuming char = 1 byte)
    • marks[5] → 5 × 4 = 20 bytes (assuming int = 4 bytes)

    So total size before padding = 30 bytes

    Padding with Arrays in a Structure

    C compilers align structure members based on the largest data type in the structure (for memory efficiency). Padding may be inserted:

    Rules:

    1. Each member is aligned to its natural boundary (size of data type).
    2. Compiler may add padding between members and at the end of structure.

    Example:

    struct Student {
        char name[10]; // 10 bytes
        int marks[5];  // 20 bytes, int alignment = 4
    };
    

    Step-by-step layout:

    • name[10] → offset 0–9
    • Padding → next multiple of 4 → offset 10–11 (2 bytes padding)
    • marks[5] → offset 12–31

    Final structure size = 32 bytes

    So even with arrays, padding ensures proper alignment.

    Array of Structures vs Structure with Array

    Let’s clarify this common confusion.

    A. Array of Structures

    struct Student {
        char name[20];
        int marks;
    };
    
    struct Student students[3]; // Array of 3 Student structures
    
    • Memory layout: each structure is stored contiguously
    • Example (if size of one Student = 24 bytes):
    | Student1 | Student2 | Student3 |
    
    • Each structure can have different values, accessed as students[0].marks etc.

    Useful when you have multiple records.

    B. Structure with Array

    struct Class {
        char name[20];
        int marks[3];
    };
    
    • Memory layout:
    | name[20] | marks[0] | marks[1] | marks[2] |
    
    • One structure holds multiple related values in arrays.
    • All values are inside a single structure.

    Useful when you have one entity with multiple properties.

    Key Difference

    FeatureArray of StructuresStructure with Array
    MemoryMultiple structures in contiguous memorySingle structure holds array elements
    Accessstudents[0].marksclass1.marks[0]
    Use CaseMultiple entitiesOne entity with multiple properties

    Visualization Example

    Array of Structures:

    Student[0]: name | marks
    Student[1]: name | marks
    Student[2]: name | marks
    

    Structure with Array:

    Class: name | marks[0] | marks[1] | marks[2]
    

    Yes, we can declare arrays inside a union in C. Just like other members, arrays inside a union share the same memory with the union, and the size of the union is determined by its largest member.

    Syntax

    union UnionName {
        int numbers[5];
        char name[10];
    };
    

    Example

    #include <stdio.h>
    #include <string.h>
    
    union Data {
        int numbers[3];
        char name[10];
    };
    
    int main() {
        union Data d;
    
        // Assign values to array
        d.numbers[0] = 10;
        d.numbers[1] = 20;
        d.numbers[2] = 30;
    
        printf("Numbers: %d %d %d\n", d.numbers[0], d.numbers[1], d.numbers[2]);
    
        // Assign values to char array (overwrites numbers)
        strcpy(d.name, "Nish");
    
        printf("Name: %s\n", d.name);
        printf("Numbers[0] after name assignment: %d\n", d.numbers[0]); // Memory overwritten
    
        return 0;
    }
    

    Output:

    Numbers: 10 20 30
    Name: Nish
    Numbers[0] after name assignment: (undefined, memory overwritten)
    

    Memory Concept

    • All members share the same memory block.
    • Size of union = size of largest member (array included).
    • Only one member can hold valid data at a time.
    • Assigning to an array overwrites previous data in the union.

    Example of Union with Array and Single Variable

    union Example {
        int arr[5];  // 5 integers
        int x;       // single integer
    };
    
    • Union size = max(size of arr, size of x) → size of arr (20 bytes if int = 4B)
    • Both x and arr share the same memory.

    Yes, a structure in C can hold multiple data types. That’s actually the main purpose of a structure.

    Explanation

    A structure is a user-defined data type that allows you to group variables of different types under a single name.

    This is useful when you want to represent a real-world object with multiple attributes of different types.

    Example

    #include <stdio.h>
    #include <string.h>
    
    struct Student {
        int roll;        // integer
        float marks;     // float
        char name[20];   // character array
    };
    
    int main() {
        struct Student s1;
    
        // Assign values
        s1.roll = 101;
        s1.marks = 89.5;
        strcpy(s1.name, "Nish");
    
        // Print values
        printf("Roll: %d\n", s1.roll);
        printf("Marks: %.2f\n", s1.marks);
        printf("Name: %s\n", s1.name);
    
        return 0;
    }
    

    Output:

    Roll: 101
    Marks: 89.50
    Name: Nish
    

    Key Points

    • Structures can combine int, float, char, arrays, pointers, and even other structures.
    • All members are stored in the order they are declared, but padding may be added for memory alignment.
    • Ideal for modeling complex objects like employees, students, or hardware registers.

    Yes, a union in C can hold multiple data types, but with an important distinction compared to structures:

    Explanation

    A union is a user-defined data type that allows you to define multiple members of different data types, but all members share the same memory location.

    Only one member can hold a valid value at a time. Assigning a value to one member overwrites the memory of other members.

    Example

    #include <stdio.h>
    #include <string.h>
    
    union Data {
        int i;
        float f;
        char name[10];
    };
    
    int main() {
        union Data d;
    
        d.i = 100;
        printf("i = %d\n", d.i);
    
        d.f = 3.14;  // overwrites d.i
        printf("f = %.2f\n", d.f);
        printf("i after f assignment = %d\n", d.i); // memory overwritten
    
        strcpy(d.name, "Nish");  // overwrites d.f
        printf("name = %s\n", d.name);
    
        return 0;
    }
    

    Output:

    i = 100
    f = 3.14
    i after f assignment = (undefined)
    name = Nish
    

    Key Points

    • A union can hold multiple data types as members.
    • Memory is shared; size = largest member.
    • Only one member is valid at a time.
    • Useful in memory-critical applications, embedded systems, or interpreting the same memory in different ways.

    In C, the size of an empty structure (a structure with no members) is not zero.

    Explanation

    • Even if a structure has no members, the compiler allocates at least 1 byte for it.
    • This ensures that each structure variable has a unique address in memory.
    • Without this, you couldn’t have distinct instances of the empty structure.

    Example

    #include <stdio.h>
    
    struct Empty {
        // no members
    };
    
    int main() {
        struct Empty e1, e2;
    
        printf("Size of empty structure: %zu bytes\n", sizeof(struct Empty));
        printf("Address of e1: %p\n", (void*)&e1);
        printf("Address of e2: %p\n", (void*)&e2);
    
        return 0;
    }
    

    Sample Output (may vary by compiler):

    Size of empty structure: 1 bytes
    Address of e1: 0x7ffee1c8a9a0
    Address of e2: 0x7ffee1c8a9a1

    Key Points

    1. Size = 1 byte (ensures unique memory address).
    2. Different from C++, where empty structure (or class) may also have size 1 due to object identity.
    3. If you add members, the size is calculated based on member sizes + padding/alignment.

    In C, the size of an empty union is also not zero, but it behaves slightly differently than a structure.

    Explanation

    • Even if a union has no members, the compiler allocates at least 1 byte.
    • This ensures that each union variable has a unique address in memory, similar to structures.
    • Reason: Without at least 1 byte, you couldn’t create multiple distinct union variables.

    Example

    #include <stdio.h>
    
    union EmptyUnion {
        // no members
    };
    
    int main() {
        union EmptyUnion u1, u2;
    
        printf("Size of empty union: %zu bytes\n", sizeof(union EmptyUnion));
        printf("Address of u1: %p\n", (void*)&u1);
        printf("Address of u2: %p\n", (void*)&u2);
    
        return 0;
    }
    

    Sample Output (may vary by compiler):

    Size of empty union: 1 bytes
    Address of u1: 0x7ffee1c8a9a0
    Address of u2: 0x7ffee1c8a9a1
    

    Key Points

    1. Size = 1 byte even if empty.
    2. Ensures unique addresses for union variables.
    3. If members are added, union size = size of largest member + padding.
    4. Same principle applies as with empty structures.

    Size Comparison: Structure vs Union in C

    TypeMembersSizeNotes
    Empty StructureNone1 byteCompiler allocates 1 byte to give a unique address to each variable.
    Empty UnionNone1 byteSame reason as structure: ensures unique memory address.
    Structure with membersint, char, float, etc.Sum of member sizes + paddingPadding added for alignment of members.
    Union with membersint, char, float, etc.Size of largest member + paddingAll members share the same memory.

    Yes, a structure in C can contain another structure as a member. This is commonly called a nested structure.

    Explanation

    • A structure can have another structure as one of its members.
    • This is useful for modeling complex objects with hierarchical data.
    • The nested structure can be accessed using the dot operator.

    Syntax

    struct Inner {
        int x;
        int y;
    };
    
    struct Outer {
        struct Inner point;  // nested structure
        char name[20];
    };
    

    Example

    #include <stdio.h>
    #include <string.h>
    
    struct Address {
        char city[20];
        int pin;
    };
    
    struct Student {
        char name[20];
        int roll;
        struct Address addr;  // nested structure
    };
    
    int main() {
        struct Student s1;
    
        strcpy(s1.name, "Nish");
        s1.roll = 101;
        strcpy(s1.addr.city, "Patna");
        s1.addr.pin = 800001;
    
        printf("Name: %s\n", s1.name);
        printf("Roll: %d\n", s1.roll);
        printf("City: %s\n", s1.addr.city);
        printf("PIN: %d\n", s1.addr.pin);
    
        return 0;
    }
    

    Output:

    Name: Nish
    Roll: 101
    City: Patna
    PIN: 800001
    

    Key Points

    1. Nested structures allow hierarchical data representation.
    2. Access members using outer.inner syntax.
    3. You can also declare arrays of nested structures.
    4. Padding and alignment rules apply for each member, including nested structures.

    Yes, a union in C can contain another union as a member. This is similar to nested structures, but the memory-sharing rules of unions apply.

    Explanation

    • A union can have another union as a member, along with other data types.
    • All members of the outer union share the same memory, including the nested union.
    • At any given time, only one member of the outer union is valid, whether it’s a simple variable or the nested union.

    Syntax

    union InnerUnion {
        int x;
        float y;
    };
    
    union OuterUnion {
        char ch;
        union InnerUnion inner;  // nested union
    };
    

    Example

    #include <stdio.h>
    
    union InnerUnion {
        int x;
        float y;
    };
    
    union OuterUnion {
        char ch;
        union InnerUnion inner;
    };
    
    int main() {
        union OuterUnion u;
    
        u.ch = 'A';
        printf("ch = %c\n", u.ch);
    
        u.inner.x = 100;  // overwrites ch
        printf("inner.x = %d\n", u.inner.x);
        printf("ch after inner.x assignment = %c\n", u.ch);  // memory overwritten
    
        return 0;
    }
    

    Output:

    ch = A
    inner.x = 100
    ch after inner.x assignment = (undefined)
    

    Key Points

    1. Memory of outer union is shared among all members, including nested unions.
    2. Only one member of the outer union is valid at a time.
    3. Useful in memory-critical applications where you want to interpret the same memory in different ways.
    4. Size of outer union = largest member (may be the nested union).

    Yes, a structure in C can contain a union as one of its members. This is very common in scenarios where you want a single field to hold multiple types of data while still keeping other fixed fields in the structure.

    Explanation

    • A structure can have fixed-type members and also a union member.
    • The union inside the structure shares memory for its members, but the rest of the structure’s members have their own memory.
    • Accessing members of the union is done via the dot operator for the structure and then the union member.

    Syntax

    union Data {
        int i;
        float f;
        char ch;
    };
    
    struct Student {
        char name[20];
        int roll;
        union Data info;  // union inside structure
    };
    

    Example

    #include <stdio.h>
    #include <string.h>
    
    union Info {
        int marks;
        float percentage;
    };
    
    struct Student {
        char name[20];
        int roll;
        union Info score;  // union member
    };
    
    int main() {
        struct Student s1;
    
        strcpy(s1.name, "Nish");
        s1.roll = 101;
    
        s1.score.marks = 95;
        printf("Name: %s\nRoll: %d\nMarks: %d\n", s1.name, s1.roll, s1.score.marks);
    
        s1.score.percentage = 92.5;  // overwrites marks
        printf("Percentage: %.2f\nMarks after overwrite: %d\n", s1.score.percentage, s1.score.marks);
    
        return 0;
    }
    

    Output:

    Name: Nish
    Roll: 101
    Marks: 95
    Percentage: 92.50
    Marks after overwrite: (undefined)
    

    Key Points

    1. Structure members have their own memory, union members share memory.
    2. Only one member of the union is valid at a time.
    3. Useful in embedded systems, protocol handling, and memory-efficient applications.
    4. Size of structure = sum of other members + size of union + padding for alignment.

    Yes, a union in C can contain a structure as one of its members. This is a common technique when you want a single memory location to store different types of data, including complex data types like structures.

    Explanation

    • A union can have primitive types (int, char, float) and structures as members.
    • All members of the union share the same memory, including the nested structure.
    • At any time, only one member of the union is valid, whether it’s a structure or a simple type.
    • This is often used in memory-efficient programming and embedded systems.

    Syntax

    struct Address {
        char city[20];
        int pin;
    };
    
    union StudentInfo {
        int roll;
        struct Address addr;  // structure inside union
    };
    

    Example

    #include <stdio.h>
    #include <string.h>
    
    struct Address {
        char city[20];
        int pin;
    };
    
    union StudentInfo {
        int roll;
        struct Address addr;  // structure inside union
    };
    
    int main() {
        union StudentInfo s;
    
        s.roll = 101;
        printf("Roll: %d\n", s.roll);
    
        strcpy(s.addr.city, "Patna");  // overwrites roll
        s.addr.pin = 800001;
        printf("City: %s\nPIN: %d\n", s.addr.city, s.addr.pin);
        printf("Roll after overwriting with addr: %d\n", s.roll); // memory overwritten
    
        return 0;
    }
    

    Output:

    Roll: 101
    City: Patna
    PIN: 800001
    Roll after overwriting with addr: (undefined)
    

    Key Points

    1. Memory of the union is shared among all members, including the structure.
    2. Only one member of the union is valid at a time.
    3. Size of the union = size of the largest member (structure included).
    4. Useful for memory-saving techniques, embedded systems, and interpreting the same memory differently.

    Conclusion: Structure and Union Interview Questions in C

    After going through these 15 fundamental questions on structures and unions in C, you should now have a solid understanding of how these user-defined data types work.

    Key takeaways:

    1. Structures allow you to group multiple variables of different data types together while giving each member its own memory.
    2. Unions let you store different types of data in the same memory location, saving memory but allowing only one member to be valid at a time.
    3. Understanding memory allocation, padding, and alignment is crucial, especially in embedded systems and low-level programming.
    4. Both structures and unions can be nested, contain arrays, or even include each other to model complex hierarchical data.
    5. Knowing the differences between structure and union, and how memory is shared or allocated, is a common interview topic and helps you write efficient C programs.

    By practicing these questions and experimenting with memory layouts and code examples, you can confidently handle interview questions on structures and unions, as well as use them effectively in real-world C applications.

    If you’re learning C programming and want to strengthen your fundamentals before practicing Structures and Unions Interview Questions, you should explore this detailed beginner-friendly guide on structures: Structures in C – Complete Guide
    It explains structure syntax, memory layout, padding, nesting, and real-world examples in a very simple way. Reading this will give you a strong foundation before jumping into advanced interview questions.

    1. What is a structure in C?

    A structure in C is a user-defined data type that allows you to group different types of variables under a single name, making it easier to organize and manage complex data.

    2. What is a union in C?

    A union in C is a special data type where all members share the same memory location, allowing only one member to store a valid value at a time, which saves memory.

    3. Can a structure hold multiple data types?

    Yes, a structure can hold variables of different data types such as int, float, char arrays, or even other structures, allowing hierarchical and complex data representation.

    4. Can a union hold multiple data types?

    Yes, a union can include multiple data types, but only one member can hold a valid value at a time, because all members share the same memory space.

    5. What is the difference between a structure and a union in C?

    Structure: Each member has its own memory; all members can be used simultaneously.
    Union: Members share memory; only one member can be used at a time.
    Memory efficiency: Union is more memory-efficient than structure for storing mutually exclusive data.

    6. How is memory allocated for a structure?

    Memory for a structure is allocated as the sum of all member sizes plus any padding added for alignment, ensuring efficient access by the CPU.

    7. How is memory allocated for a union?

    Memory for a union is allocated based on the size of its largest member, as all members share the same memory space, ensuring only one member is valid at a time.
  • Structures and Unions Interview Questions Powerful & Essential Questions for Success (2026)

    Explore the best Structures and Unions Interview Questions with 50+ powerful, beginner-friendly to advanced examples. Boost your C skills and prepare with confidence.

    If you’re preparing for a C or embedded systems interview, you must be ready for Structures and Unions Interview Questions. These topics look simple, but interviewers ask surprisingly tricky problems around memory layout, padding, alignment, nested usage, and differences between structures vs unions.

    Whether you’re a beginner learning C or an experienced engineer brushing up for a system-level role, this guide gives you crystal-clear explanations, real examples, and practical scenarios that hiring managers love to ask .

    If you’re learning C programming and want to strengthen your fundamentals before practicing Structures and Unions Interview Questions, you should explore this detailed beginner-friendly guide on structures: Structures in C – Complete Guide
    It explains structure syntax, memory layout, padding, nesting, and real-world examples in a very simple way. Reading this will give you a strong foundation before jumping into advanced interview questions.

    Introduction of Structures and Unions Interview Questions

    C is powerful because it gives you full control over memory. With that power comes responsibility and interviewers test whether you truly understand memory behavior.

    Two of the biggest tools in C for organizing and controlling memory layouts are:

    • Structure
    • Union

    This article focuses on all levels of structured interview questions and answers, especially tailored for c interview questions on structures and unions that appear in companies like Qualcomm, STMicroelectronics, Samsung, NXP, KPIT, TCS, and more.

    What Are Structures?

    In simple words:

    • A structure in C is a way to group different variables under one name.
    • Each member of a structure gets its own memory.

    Example

    struct Employee {
        int id;
        float salary;
        char grade;
    };
    

    Memory is allocated for all members separately.

    What Are Unions?

    A union is like a structure, but all variables share the same memory location.

    Think of it like a single container used by multiple items—only one item can exist meaningfully at a time.

    Example

    union Data {
        int id;
        float value;
        char ch;
    };
    

    Size = size of largest member.

    This simple difference is the root of almost all structure and union interview questions.

    Structures vs Unions

    Let’s break it down:

    FeatureStructureUnion
    MemorySeparate memory for each memberShared memory for all
    SizeSum of all members (with padding)Size of largest member
    UsageStore multiple values at onceStore one value at a time
    Example UseEmployee recordsEmbedded protocol decoding

    You’ll often hear the term unions vs structures in C in interviews when discussing memory behavior.

    Beginner-Level Structures and Unions Interview Questions

    Let’s warm up with friendly, simple questions.

    What is a structure in C?

    A structure is a user-defined datatype that groups different datatypes under one name.

    Great for modeling real-world things like employee, car, sensor, etc.

    What is a union in C?

    A union is similar to a structure, but all members share the same memory.

    This is the simplest form of union questions asked in interviews.

    Why do we use structures?

    To store data logically and keep multiple variables grouped.

    Why do we use unions?

    To save memory, especially in:

    • Embedded systems
    • Protocol parsers
    • Hardware registers

    This is common in questions on unions in interviews.

    What is the size of a structure and union?

    • Structure → sum of members + padding
    • Union → size of largest member

    Can a structure contain another structure?

    Yes. This leads to nested structures, a common part of structural questions examples.

    Can a union contain another union?

    Yes, but rarely used unless memory reuse is needed.

    Intermediate-Level Structure and Union Interview Questions

    Here we get into deeper concepts like padding, alignment, pointers, typedef, and passing structures to functions.

    How does padding affect structures?

    C aligns structure members to the CPU’s natural alignment.
    This affects size and layout.

    Example:

    struct test {
        char a;   // 1 byte
        int b;    // 4 bytes
    };
    

    Size is 8 bytes, not 5, because of alignment.

    Can we remove structure padding?

    Yes, using:

    • #pragma pack(1)
    • __attribute__((packed)) (GCC)

    How to pass a structure to a function?

    Three ways:

    1. By value
    2. By pointer
    3. By reference using pointer

    Can we compare two structures directly?

    No.
    You must compare member-wise.

    What happens if you read one union member after writing another?

    This is undefined behavior.

    This comes up in structures and unions in C interview questions and answers.

    How does a union save memory?

    Because it allocates memory only once for the largest member.

    When should you choose structures vs unions

    Use structure when you need multiple values at the same time.
    Use union when you need different interpretations of the same memory block.

    Advanced Structures and Unions Interview Questions and Answers

    These are the tricky questions interviewers love to ask.

    Explain memory layout of structure vs union

    Structure:

    | a | b | c |
    

    Union:

    | shared memory |
    

    What is a flexible array member?

    Used to create dynamic-sized structure:

    struct packet {
        int size;
        char data[];
    };
    

    Why do embedded systems use unions for register mapping?

    Because hardware registers can be accessed in multiple formats.

    Example:

    union Register {
        uint32_t value;
        struct {
            uint32_t flag1:1;
            uint32_t flag2:1;
            uint32_t mode:2;
        } bits;
    };
    

    Can a union have bitfields?

    Yes.
    Very important in systems programming.

    Can a structure contain a union and vice-versa?

    Yes, example:

    struct Packet {
        int type;
        union {
            int id;
            float value;
        } data;
    };
    

    What is union-intersection test example?

    Example:

    Say you have two sets:

    A = {1,2,3}
    B = {2,3,4}

    Intersection = {2,3}

    A union B = {1,2,3,4}

    Used in questions around union-intersection test example.

    Explain real-life use of union in protocol parsing

    Protocols often require interpreting the same data as:

    • bytes
    • words
    • floats
    • struct of bits

    Unions let us do that efficiently.

    Can we initialize multiple union members?

    No.
    Only the last initialized member holds valid data.

    How does endianness affect structures and unions?

    Very common question.

    Union endianness example:

    union test {
        int x;
        char ch[4];
    };
    

    Real-World Embedded Use Cases

    Interviewers are impressed when you explain real embedded usage.

    Use Case 1: Sensor Packet Parsing

    Unions help reinterpret raw bytes as structured data.

    Use Case 2: Memory Optimization

    In microcontrollers with limited RAM, unions reduce RAM footprint.

    Use Case 3: Register Access

    Mapping hardware registers using bitfields inside unions is extremely common.

    Use Case 3: Variant Message Types

    Example:

    struct Message {
        int type;
        union {
            int temp;
            float pressure;
            char status;
        } data;
    };
    

    More Deep Interview Questions on Structure and Union in C

    Below is a rich list of questions helpful for Qualcomm, Samsung, and system interviews.

    Why cannot we take size of incomplete structure?

    Because compiler doesn’t yet know memory layout.

    What is self-referencing structure?

    A structure that contains pointer to itself:

    struct node {
        int data;
        struct node *next;
    };
    

    Difference between typedef struct and struct?

    typedef gives alias.
    No functional difference.

    Are structures stored in stack or heap?

    Depends:

    • Local → stack
    • Dynamically allocated → heap

    Can we copy a structure using memcpy?

    Yes—but be careful with pointers.

    Is accessing union data type-safe?

    No, union is inherently unsafe if misused.

    What are structure padding and alignment?

    Padding = unused bytes inserted for alignment.
    Alignment = data placed at addresses divisible by data size.

    50+ Structures and Unions Interview Questions

    Beginner-Level Questions (Basics)

    1. What is a structure in C?
    2. What is a union in C?
    3. What is the difference between structure and union?
    4. How is memory allocated in a structure?
    5. How is memory allocated in a union?
    6. Can we declare arrays inside a structure?
    7. Can we declare arrays inside a union?
    8. Can a structure hold multiple data types?
    9. Can a union hold multiple data types?
    10. What is the size of an empty structure?
    11. What is the size of an empty union?
    12. Can a structure contain another structure?
    13. Can a union contain another union?
    14. Can a structure contain a union?
    15. Can a union contain a structure?

    Intermediate-Level Questions (Memory, Padding, Function Calls)

    1. What is structure padding?
    2. What is structure alignment?
    3. What is structure packing?
    4. How to disable structure padding?
    5. Why does padding exist in structures?
    6. Why do unions not have padding between members?
    7. Can we compare two structures using == operator?
    8. Can we compare two union variables using == operator?
    9. How do you pass a structure to a function?
    10. How do you return a structure from a function?
    11. Can a structure be initialized at the time of declaration?
    12. Can a union be initialized at the time of declaration?
    13. What happens if we read a union member that was not last written?s
    14. What is a pointer to a structure?
    15. What is the arrow operator (->) used for?
    16. What is a typedef structure?
    17. What is a flexible array member in a structure?
    18. What are bitfields in structures?
    19. Can unions contain bitfields?

    Advanced-Level Questions (Embedded, Type Punning, Internals)

    1. How do you calculate the size of a structure manually?
    2. How do you calculate the size of a union manually?
    3. What is the maximum alignment requirement in a structure?
    4. What is the advantage of using unions in embedded systems?
    5. What is type punning using union?
    6. What is the effect of endianness in unions?
    7. What are tagged unions?
    8. What is a self-referential structure?
    9. How do you allocate memory dynamically for structures?
    10. Can we use memcpy() with structures?
    11. Why is it risky to use unions for type-casting?
    12. What is the layout of structure members in memory?
    13. What is the layout of union members in memory?
    14. Can a structure be packed differently on different compilers?
    15. Are unions guaranteed to store overlapping memory?
    16. What happens when structure members have mixed datatypes (char, int, float)?
    17. How do you map hardware registers using structures?
    18. How do you map hardware registers using unions?
    19. Why do protocols use unions for parsing data?
    20. What is offsetof() macro and how is it used with structures?
    21. How is bit-endianness handled inside a union bitfield?
    22. Can structures be used to implement linked lists, stacks, and trees?
    23. Why is structure assignment more expensive than union assignment?
    24. Can unions be used to interpret raw data packets?
    25. What is the difference between unions vs structures in handling memory failures?

    FAQ of Structures and Unions Interview Questions

    Q1: What are the most common Structures and Unions Interview Questions?

    Questions on memory layout, padding, size, nested usage, unions vs structures, and bitfields are the most common.

    Q2: Why do interviewers ask questions about structures and unions in C?

    Because these reveal your understanding of memory, alignment, and low-level behavior.

    Q3: What’s the main difference between structures vs unions in C?

    Structure stores all members; union stores only one member at a time.

    Q4: How do unions save memory?

    Because all members share the same location.

    Q5: Are unions used in embedded systems?

    Yes, especially for register access and protocol parsing.

    Q6: Do structures have padding?

    Yes, for alignment.

    Q7: Can we remove padding?

    Yes, using packed attributes.

    Q8: What are common c interview questions on structures and unions?

    Size calculation, memory layout, bitfields, casting, union type punning.

    Q9: Is union safe to use?

    Only if used correctly.

    Q10: What are structured interview questions and answers?

    These are standardized questions asked in HR interviews.

    Q11: What are union structures in organizational context?

    Local, regional, national labor union structures.

    Conclusion

    If you read this entire guide, you now understand:

    • Structures and unions in C
    • Differences between structures vs unions
    • Memory layout, padding, alignment
    • Beginner to advanced structure and union interview questions in C
    • Real-world embedded usage
    • A long list of practice questions
  • Master Structures in C – A Beginner’s Guide with Interview Questions (2026)

    Structures in C : Unlock the power of structures in C programming with this beginner-friendly guide tailored for 2025 tech interviews! Whether you’re new to C or brushing up for embedded and systems programming interviews, this post offers a clear and practical explanation of structures — from basic syntax to advanced concepts like structure padding, bit-fields, and pointers to structures.

    Dive deep into real-world examples, memory layout illustrations, and commonly asked interview questions that help you build a strong foundation and gain confidence in handling Structures data in C.

    What You’ll Learn:

    • What is a structure and why it’s used in C
    • How to define, initialize, and access structure members
    • Structure padding and memory alignment
    • Bit-fields and their practical usage
    • Structure pointers and dynamic memory allocation
    • Array of structures and nested structures
    • Top interview questions and expert tips

    Perfect for students, job-seekers, and professionals aiming to master data organization in C, this guide equips you with everything you need to ace interviews and write better, cleaner C code.

    What is a Structure in C?

    A structure is a user-defined data type that allows combining variables of different types under one name. Each variable inside a structure is called a member of the structure.

    Syntax:

    struct StructureName {
        dataType member1;
        dataType member2;
        ...
    };
    

    Example:

    #include <stdio.h>
    
    struct Student {
        int id;
        char name[50];
        float marks;
    };
    
    int main() {
        struct Student s1 = {1, "John", 87.5};
        
        printf("ID: %d\n", s1.id);
        printf("Name: %s\n", s1.name);
        printf("Marks: %.2f\n", s1.marks);
        
        return 0;
    }
    

    Key Concepts:

    Declaration

    You can declare a structure type and create variables:

    struct Employee {
        int emp_id;
        float salary;
    } e1, e2;
    

    Accessing Structure Members

    Use the dot (.) operator:

    e1.emp_id = 101;
    e1.salary = 50000.00;
    

    Structure Pointer and Arrow (->) Operator

    struct Employee *ptr = &e1;
    ptr->salary = 55000.00;
    

    Nested Structures

    struct Date {
        int day, month, year;
    };
    
    struct Employee {
        int id;
        struct Date joiningDate;
    };
    

    Array of Structures

    struct Student students[5];
    

    Why Use Structures?

    • To group logically related data
    • To create complex data models
    • To make code more readable and maintainable
    • Crucial for hardware register mapping in embedded C

    Memory Layout of Structures

    Structure members are stored sequentially in memory, and padding may be added for alignment. You can control this using #pragma pack (compiler-specific).

    Important Notes:

    • You can’t initialize members inside the struct definition.
    • Structures can’t contain functions, but they can contain function pointers.
    • sizeof(struct) returns the size including padding bytes.
    • You can pass structure to functions by value or pointer.

    What is the size of a structure in C if nothing is defined inside it?

    In Standard C:

    In standard C (C89/C90 and later), a structure must contain at least one member. An empty structure is not allowed and will typically give a compiler error.

    Example:

    struct Empty {
        // nothing inside
    };
    
    int main() {
        struct Empty e;
        printf("%lu", sizeof(e));
        return 0;
    }
    

    Output (for most compilers like GCC):

    error: structure has no members
    

    In GNU C (GCC) – Extension:

    GCC does allow empty structures as a compiler extension (used sometimes in low-level code or placeholders). In such cases:

    • The size of an empty struct is typically 1 byte, to ensure each variable has a unique address.

    ✔️ Example (GCC):

    struct Empty { };
    
    int main() {
        struct Empty e;
        printf("%zu\n", sizeof(e)); // Output: 1
        return 0;
    }
    

    Why 1 byte?

    This is done to ensure that even an empty structure occupies a unique memory location (not zero bytes), which is important for things like:

    • Arrays of structures
    • Memory alignment
    • Pointers

    Summary Table:

    CompilerEmpty struct allowed?sizeof(struct)
    GCC✅ (extension)1 byte
    Clang✅ (extension)1 byte
    MSVC❌ (error)Compilation error
    Standard C❌ (not allowed)Compilation error

    Interview Tip:

    Q: What is the size of an empty structure in C?

    A: In standard C, empty structures are not allowed and give a compile-time error. But in GCC (as an extension), it is allowed and the size is 1 byte.

    Structure Padding in C

    What is Padding?

    Padding is the process of adding unused memory (bytes) between structure members to align data in memory according to the CPU architecture’s alignment requirements.

    Why is Padding Needed?

    Most processors access data faster when it’s aligned to its natural boundary:

    • int (4 bytes) should be stored at addresses divisible by 4
    • short (2 bytes) at addresses divisible by 2, etc.

    To maintain this alignment, compilers insert padding bytes between structure members.

    Example of Padding:

    #include <stdio.h>
    
    struct A {
        char a;   // 1 byte
        int b;    // 4 bytes
    };
    
    int main() {
        printf("Size of struct A: %lu\n", sizeof(struct A));
        return 0;
    }
    

    Output:

    Size of struct A: 8
    

    Explanation:

    MemberSizeOffsetNotes
    a1 B0
    padding3 B1-3for alignment
    b4 B4-7aligned on 4-byte boundary

    How to Minimize Padding?

    1. Reorder members from largest to smallest:
    struct B {
        int b;   // 4 bytes
        char a;  // 1 byte
    };
    

    ➡️ sizeof(struct B) will be 8, but more efficient than previous layout.

    1. Use #pragma pack(1) to disable padding (GCC-specific):
    #pragma pack(1)
    struct Packed {
        char a;
        int b;
    };
    #pragma pack()
    

    But be careful—disabling padding can cause slower access or alignment faults on some hardware (especially embedded/ARM CPUs).

    What is typedef in C?

    typedef is a keyword in C (and C++) used to create a new alias (name) for an existing data type. It helps in making code more readable, portable, and easier to maintain.

    Syntax:

    typedef existing_type new_type_name;
    

    Basic Example:

    typedef unsigned int uint;
    
    uint a = 10;   // Same as: unsigned int a = 10;
    

    Here, uint is a new name (alias) for unsigned int.

    Why Use typedef?

    PurposeBenefit
    Simplify complex typesMakes code readable and reduces clutter
    Increase portabilityAbstracts platform-dependent types (e.g., typedef int int32_t)
    Easier maintenanceUpdate one typedef instead of multiple changes in code
    Used with structsGives simple names to struct types without needing struct every time

    Common Use with struct:

    struct Student {
        int id;
        char name[50];
    };
    
    typedef struct Student Student;
    

    Now you can just write:

    Student s1;
    

    Instead of:

    struct Student s1;
    

    Or even more compact:

    typedef struct {
        int id;
        char name[50];
    } Student;
    

    With Pointers:

    typedef int* IntPtr;
    
    IntPtr p1, p2;  // Both p1 and p2 are int pointers
    

    Common Mistake:

    typedef int* IntPtr;
    
    IntPtr a, b;
    

    Many think both a and b are int*, but they are. This is correct.

    But if written as:

    int* a, b;  // a is int*, b is int (confusing)
    

    This is why typedef helps avoid confusion.

    Summary:

    FeatureDescription
    Keywordtypedef
    PurposeRename/alias a data type
    UsageUseful with structs, complex pointers
    BenefitImproves code clarity and maintainability

    Bit Fields in Structures

    What Are Bit Fields?

    Bit fields allow you to allocate specific number of bits to structure members instead of full bytes.

    Syntax:

    struct Flags {
        unsigned int a : 1;
        unsigned int b : 2;
        unsigned int c : 5;
    };
    
    • a uses 1 bit
    • b uses 2 bits
    • c uses 5 bits

    This is useful in:

    • Embedded systems (e.g., setting hardware registers)
    • Flag control
    • Memory optimization

    Example:

    #include <stdio.h>
    
    struct Status {
        unsigned int error : 1;
        unsigned int ready : 1;
        unsigned int mode : 2;
    };
    
    int main() {
        struct Status s = {1, 0, 2};
        printf("Size of Status: %lu\n", sizeof(s));
        return 0;
    }
    

    Output:

    Size of Status: 4
    

    Even though total bits = 1 + 1 + 2 = 4 bits, size is still rounded to nearest word size (here: 4 bytes on 32-bit machine).

    Rules and Notes:

    • Bit fields must be of integer type
    • You can’t take address of bit field
    • Compiler decides bit packing and alignment
    • Use unsigned int to avoid sign extension issues

    Structure Pointers

    What is a Structure Pointer?

    A pointer to a structure stores the address of a structure variable. This is useful for:

    • Passing structures efficiently to functions
    • Dynamic memory allocation
    • Embedded register access

    Example:

    #include <stdio.h>
    
    struct Student {
        int id;
        char name[20];
    };
    
    int main() {
        struct Student s = {101, "John"};
        struct Student *ptr = &s;
    
        printf("ID: %d\n", ptr->id);         // OR (*ptr).id
        printf("Name: %s\n", ptr->name);
        
        return 0;
    }
    

    Access Operators:

    SyntaxMeaning
    ptr->memberShortcut to access
    (*ptr).memberLonger version

    Both work the same.

    Use in Dynamic Memory:

    struct Student *ptr = malloc(sizeof(struct Student));
    ptr->id = 10;
    strcpy(ptr->name, "Alice");
    

    Real-World Use Case: Register Mapping in Embedded C

    #define UART0_BASE 0x4000C000
    
    struct UART {
        volatile uint32_t DR;
        volatile uint32_t SR;
    };
    
    #define UART0 ((struct UART *)UART0_BASE)
    

    Now you can write:

    UART0->DR = 0x55;

    Interview Questions on Structures in C

    Beginner Level

    1. What is a structure in C?
    2. What are the advantages of using structures?
    3. How do you declare and access a structure member?
    4. What is the difference between structure and array?
    5. Can we initialize members inside the structure?

    Intermediate Level

    1. How can you pass a structure to a function?
    2. What is the difference between . and -> operators?
    3. Explain nested structures with an example.
    4. What is the size of an empty structure?
    5. Can a structure contain another structure?

    Advanced/Embedded Level

    1. How is memory aligned in structures?
    2. How to minimize structure padding in embedded C?
    3. Can a structure contain a pointer to itself?
    4. Explain structure packing using #pragma pack.
    5. How are structures used in embedded register mapping?
    6. What is structure padding and how can you avoid it?
    7. Why does the compiler insert padding bytes in a structure?
    8. What are bit fields and where are they used?
    9. Can we take the address of a bit field? Why or why not?
    10. Explain structure pointers and -> operator.
    11. How are structure pointers useful in embedded system programming?
    12. What happens when you use #pragma pack(1)?
    13. Can we dynamically allocate memory for a structure?
    14. How can structure padding affect data sent over network or stored in file?
    15. Can a struct contain a pointer to itself? What is a self-referential structure?

    Sample Embedded Interview Scenario

    struct UART_Registers {
        volatile uint32_t DR;
        volatile uint32_t SR;
        volatile uint32_t CR;
    };
    
    #define UART1 ((struct UART_Registers *) 0x40011000)
    

    Question: What does this code do?

    ✅ Answer: It defines a structure for UART registers and maps it to the memory-mapped I/O address 0x40011000.

    Summary

    FeatureStructure
    Custom Data TypeYes
    Mixed Data TypesYes
    Can be nestedYes
    Dot and Arrow AccessYes
    Memory EfficientWith alignment
    Real-world use casesSystem-level data modeling, embedded register mapping

    📘 Practice Task

    Create a structure to store employee details (name, id, department, salary), and write a C program to:

    • Read data of 5 employees
    • Print details of the highest-paid employee

    You can also Visit other tutorials of Embedded Prep 

    Special thanks to @mr-raj for contributing to this article on EmbeddedPrep