Back to C Programming
2026-07-145 min read

structures

Learn structures step by step with clear examples and exercises.

Why This Matters

Structures are a fundamental part of C programming that allow organizing data into meaningful units, making it easier to manage and manipulate complex programs. Understanding structures can be crucial for acing coding interviews, solving real-world programming problems, and avoiding common bugs when working with arrays and other data types.

Prerequisites

Before diving into structures, you should have a solid understanding of the following C concepts:

  1. Variables and constants
  2. Data types (int, float, char)
  3. Arrays
  4. Pointers
  5. Basic input/output using scanf() and printf() functions
  6. Operators and expressions
  7. Control structures like loops and conditional statements

Core Concept

In C, a structure is a user-defined data type that groups together related variables of different types under a single name or tag. This allows for more efficient and organized programming by reducing the need to declare multiple variables with similar properties.

A structure declaration consists of a series of data members enclosed within curly braces {}. Each member is defined with its own type and name, separated by commas. Here's an example of a simple structure called Person that includes fields for name, age, and address:

struct Person {
char name[50];
int age;
char address[100];
};

To create a variable of this structure type, you can use the following syntax:

struct Person myFriend;

Now myFriend is a variable that contains three fields: name, age, and address. You can access these fields using the dot (.) operator, like so:

printf("My friend's name is %s\n", myFriend.name);

You can also declare multiple variables of the same structure type in a single line:

struct Person myFriend, yourFriend;

Worked Example

Let's create a simple program that defines a Student structure containing fields for name, roll number, and marks obtained in three subjects. The program will take input for multiple students, calculate their total marks, and print the results:

#include <stdio.h>

struct Student {
char name[50];
int roll_number;
int subject1, subject2, subject3;
};

int main() {
struct Student students[5];
int total_marks, i;

printf("Enter details for 5 students:\n");

// Loop through all students
for (i = 0; i < 5; ++i) {
printf("\nStudent %d:\n", i + 1);
printf("Name: ");
scanf("%s", students[i].name);
printf("Roll Number: ");
scanf("%d", &students[i].roll_number);
printf("Subject 1 Marks: ");
scanf("%d", &students[i].subject1);
printf("Subject 2 Marks: ");
scanf("%d", &students[i].subject2);
printf("Subject 3 Marks: ");
scanf("%d", &students[i].subject3);
}

// Calculate total marks for each student and find the highest total
for (i = 0; i < 5; ++i) {
total_marks = students[i].subject1 + students[i].subject2 + students[i].subject3;
printf("\nStudent %d:\n", students[i].roll_number);
printf("Total Marks: %d\n", total_marks);
}

// Find the student with the highest total marks
total_marks = students[0].total_marks;
int best_student = 0;

for (i = 1; i < 5; ++i) {
if (students[i].total_marks > total_marks) {
total_marks = students[i].total_marks;
best_student = i + 1;
}
}

printf("\nThe student with the highest total marks is Student %d\n", best_student);

return 0;
}

Common Mistakes

  1. **Forgetting to include `**: This header file contains definitions for standard input/output functions like printf() and scanf()`.
  2. Incorrect structure declaration: Make sure to enclose data members within curly braces and separate them with commas. Also, ensure that the structure name is unique.
  3. Accessing undefined fields: Double-check that you have defined all necessary fields in your structure before trying to access them.
  4. Misusing scanf(): Be careful when using scanf() to avoid issues like format mismatch and buffer overflow. Always use the correct format specifier for each input type, and make sure to check for valid input.
  5. Forgetting semicolons: Semicolons are crucial in C; they indicate the end of a statement. Forgetting them can lead to syntax errors.
  6. Incorrect looping: Make sure your loops are properly initialized, conditioned, and incremented/decremented to avoid infinite loops or skipping elements.
  7. Not initializing variables: Uninitialized variables can contain garbage values that may cause unexpected behavior in your program. Always initialize variables before using them.

Practice Questions

  1. Create a structure called Book with fields for title, author, pages, and publication year. Write a program to take input for multiple books, calculate the total number of pages, and print the results.
  2. Modify the previous example to include an average marks calculation for each student instead of just the total marks.
  3. Create a structure called Employee with fields for name, employee ID, department, designation, and salary. Write a program that takes input for multiple employees, calculates the total salary for each department, and prints the results.
  4. Modify the previous example to include an option to sort employees by their salaries in descending order.

FAQ

  1. Can I nest structures?: Yes, you can define a structure within another structure. This is known as a nested structure.
  2. What happens if I forget to declare a structure variable before using it?: If you try to use an undeclared structure variable, the compiler will generate an error. You must first declare the variable before attempting to access its fields.
  3. Can I pass structures as function arguments?: Yes, you can pass structures as function arguments by value or by reference. Passing by value means that a copy of the structure is passed to the function, while passing by reference allows the function to modify the original structure.
  4. How do I compare two structures for equality?: To compare two structures for equality, you need to compare each field individually. You can use loops or conditional statements to check if all fields are equal.
  5. What is a union in C?: A union is another user-defined data type that allows multiple data types to share the same memory location. It is similar to a structure but with only one active member at any given time.