Back to C Programming
2026-01-178 min read

array types (C Programming)

Learn array types (C Programming) step by step with clear examples and exercises.

Why This Matters

Learning how to work with arrays in C programming is crucial as they provide an efficient way to store and manipulate multiple values of the same data type. Arrays are fundamental for various applications such as:

  • Storing collections of data, like an array of integers to represent the results of a quiz
  • Creating 2D arrays for matrix operations in linear algebra or game development
  • Implementing efficient search algorithms like binary search
  • Handling dynamic memory allocation using pointers and functions such as malloc() and calloc()

Mastering arrays will help you solve real-world problems, perform better in exams and interviews, and develop more robust and scalable programs.

Prerequisites

To fully understand this lesson, it's essential that you have a solid grasp of the following concepts:

  • Basic C syntax: variables, data types, operators, control structures (if-else, loops)
  • Functions and function prototypes
  • Pointers and memory allocation in C
  • File I/O using standard library functions like fopen(), fread(), fwrite(), and fclose()

If you're not familiar with these topics, consider reviewing them before diving into arrays.

Core Concept

Array Declaration

An array is a collection of elements of the same data type stored contiguously in memory. To declare an array, we specify its element type and size within square brackets []. Here's an example:

int arr[5]; // An array of 5 integers

In this example, arr is the name of the array, int is the data type of its elements, and 5 represents the size of the array. The elements can be accessed using an index, starting from zero:

arr[0] = 12; // Assigning a value to the first element
arr[4] = 34; // Assigning a value to the last element (index 4)

Multidimensional Arrays

Multidimensional arrays, also known as matrices, are used to represent tables of data with multiple rows and columns. They can be declared using nested square brackets:

int matrix[3][4]; // A 3x4 matrix of integers

In this example, matrix is a 3x4 matrix of integers. The elements can be accessed using two indices: the first index corresponds to the row, and the second index corresponds to the column:

matrix[0][2] = 15; // Assigning a value to the element at row 0 and column 2

Array Initialization

Initializing an array during declaration allows you to set its values directly. Here's an example:

int arr[5] = {1, 2, 3, 4, 5}; // Declaring and initializing an array of 5 integers

Array Sizes and Memory Allocation

When declaring arrays, the size must be specified at compile-time. For dynamically sized arrays, you can use functions like malloc() or calloc() to allocate memory:

int *arr; // Declaring a pointer to an integer, but not allocating memory
arr = malloc(10 * sizeof(int)); // Allocating memory for 10 integers using malloc()

Common Uses of Arrays in C Programming

  • Storing collections of data: int scores[10]; to store the results of a quiz for 10 students
  • Creating 2D arrays for matrix operations: double A[3][4]; for a 3x4 matrix of doubles
  • Implementing efficient search algorithms like binary search: int arr[] = {1, 3, 5, 7, 9}; to find the index of a specific value in an array
  • Handling dynamic memory allocation using pointers and functions such as malloc() and calloc(): int *arr = malloc(n * sizeof(int)); for dynamically allocating memory for an array of n integers

Common Mistakes

Array Index Out of Bounds

One common mistake is accessing an array index that is out of bounds, which results in undefined behavior:

int arr[5];
arr[5] = 10; // Accessing an invalid index (out of bounds)

To avoid this error, always ensure that the index is within the valid range (0 to size - 1).

Array Size and Memory Allocation

Another common mistake is forgetting to allocate memory for dynamically sized arrays:

int *arr; // Declaring a pointer to an integer, but not allocating memory
arr[0] = 5; // Attempting to access memory that hasn't been allocated, causing a segmentation fault

To avoid this error, always allocate memory for dynamically sized arrays using functions like malloc() or calloc().

Uninitialized Variables

If variables are not explicitly initialized, they will contain random values:

int arr[10]; // Declaring an uninitialized array of 10 integers
printf("%d\n", arr[0]); // Printing a random value stored in the first element

To avoid this error, always initialize variables with appropriate values or set them to default values like zero.

Array Assignment vs Copy

When assigning one array to another, only the pointers are copied, not the elements:

int arr1[5] = {1, 2, 3, 4, 5}; // Declaring an initialized array of 5 integers
int arr2[5]; // Declaring an uninitialized array of 5 integers
arr2 = arr1; // Copying the pointer to arr2, not the elements

In this example, both arr1 and arr2 point to the same memory location. Changing the values in one array will affect the other as well:

arr2[0] = 10; // Changing the value of arr2[0], which also changes arr1[0]
printf("%d\n", arr1[0]); // Outputs "10" because arr1[0] was changed when arr2[0] was set to 10

To avoid this error, use the memcpy() function if you need to copy the elements of one array to another.

Worked Example

Let's create an example program that declares and initializes a 10-element array of integers, then calculates and prints the sum of all elements:

#include <stdio.h>

int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // Declaring and initializing an array of 10 integers
int sum = 0; // Initializing a variable to store the sum of all elements

for (int i = 0; i < 10; ++i) {
sum += arr[i]; // Calculating the sum by adding each element
}

printf("The sum of all elements in the array is: %d\n", sum); // Printing the result

return 0;
}

When you run this program, it should output 55, which is the sum of the numbers from 1 to 10.

Common Mistakes

Uninitialized Variables

If variables are not explicitly initialized, they will contain random values:

int arr[10]; // Declaring an uninitialized array of 10 integers
printf("%d\n", arr[0]); // Printing a random value stored in the first element

To avoid this error, always initialize variables with appropriate values or set them to default values like zero.

Array Assignment vs Copy

When assigning one array to another, only the pointers are copied, not the elements:

int arr1[5] = {1, 2, 3, 4, 5}; // Declaring an initialized array of 5 integers
int arr2[5]; // Declaring an uninitialized array of 5 integers
arr2 = arr1; // Copying the pointer to arr2, not the elements

In this example, both arr1 and arr2 point to the same memory location. Changing the values in one array will affect the other as well:

arr2[0] = 10; // Changing the value of arr2[0], which also changes arr1[0]
printf("%d\n", arr1[0]); // Outputs "10" because arr1[0] was changed when arr2[0] was set to 10

To avoid this error, use the memcpy() function if you need to copy the elements of one array to another.

Common Mistakes (continued)

Forgetting to Allocate Memory for Dynamically Sized Arrays

When using dynamically sized arrays, it's essential to allocate memory before accessing the elements:

int *arr; // Declaring a pointer to an integer, but not allocating memory
arr[0] = 5; // Attempting to access memory that hasn't been allocated, causing a segmentation fault

To avoid this error, always allocate memory for dynamically sized arrays using functions like malloc() or calloc().

Array Index Out of Bounds

One common mistake is accessing an array index that is out of bounds, which results in undefined behavior:

int arr[5];
arr[5] = 10; // Accessing an invalid index (out of bounds)

To avoid this error, always ensure that the index is within the valid range (0 to size - 1).

Practice Questions

  1. Write a program that declares and initializes a 3x3 matrix of integers, then calculates and prints the trace (sum of elements on the main diagonal).
  2. Write a program that sorts an array of 10 integers using bubble sort.
  3. Given an array of integers, write a function that returns the second largest number in the array without using any additional data structures or arrays.
  4. Write a program that declares and initializes a 5x5 matrix of floating-point numbers representing a 2D grid. Then, calculate and print the sum of all elements in the matrix.

Subheadings under Common Mistakes:

Uninitialized Variables

If variables are not explicitly initialized, they will contain random values:

int arr[10]; // Declaring an uninitialized array of 10 integers
printf("%d\n", arr[0]); // Printing a random value stored in the first element

To avoid this error, always initialize variables with appropriate values or set them to default values like zero.

Array Assignment vs Copy

When assigning one array to another, only the pointers are copied, not the elements:

int arr1[5] = {1, 2, 3, 4, 5}; // Declaring an initialized array of 5 integers
int arr2[5]; // Declaring an uninitialized array of 5 integers
arr2 = arr1; // Copying the pointer to arr2, not the elements

In this example, both arr1 and arr2 point to the same memory location. Changing the values in one array will affect the other as well:

arr2[0] = 10; // Changing the value of arr2[0], which also changes arr1[0]
printf("%d\n", arr1[0]); // Outputs "10" because arr1[0] was changed when arr2[0] was set to 10

To avoid this error, use the memcpy() function if you need to copy the elements of one array to another.

FAQ

How can I find out the size of an array at runtime?

In C, you cannot determine the size of an array at runtime because it is a compile-time constant. However, you can use dynamic memory allocation functions like malloc() to create arrays of variable size.

Can I declare a multidimensional array with different sizes for each dimension?

Yes, you can declare a multidimensional array with different sizes for each dimension using Variable-Length Arrays (VLAs), but they are only supported in C99 and later versions. Here's an example:

void vla_example() {
int rows;
printf("Enter the number of rows: ");
scanf("%d", &rows);

int arr[rows]; // Declaring a VLA with a size determined at runtime

for (int i = 0; i < rows; ++i) {
arr[i] = i * i; // Initial