How to Get the Length of an Array in C: A Complete Beginner-to-Advanced Guide

1. Introduction

The C programming language, known for its simplicity and high performance, is widely used in various fields such as system development and embedded systems. Among its many features, arrays are an essential data structure for managing groups of data, frequently used in countless programs.

This article provides a detailed explanation of how to get the length of an array in C. We will cover common pitfalls for beginners, as well as both basic and advanced techniques, so you can confidently determine array lengths with precision.

2. Basic Concepts of Arrays

What is an Array?

An array is a data structure that allows you to store and manage multiple values of the same data type together. Arrays are convenient for processing multiple pieces of data at once, storing elements of the same type in contiguous memory locations.

Uses of Arrays

  1. Batch Data Processing – Ideal for managing similar types of data together, such as student grades or sensor readings.
  2. Efficient Loop Operations – Arrays allow sequential access using loops, making repetitive tasks more efficient.
  3. Memory Efficiency – Since arrays use contiguous memory, access speed is faster and memory usage is efficient.

How Arrays Work

Arrays use indexes (subscripts) to access individual elements. In C, indexes start at 0, and the last element is accessed using array size - 1.

Example:

int numbers[5] = {10, 20, 30, 40, 50};
printf("%d\n", numbers[0]); // Outputs 10
printf("%d\n", numbers[4]); // Outputs 50

In this example, the numbers array stores five integers, accessible by their index.

侍エンジニア塾

3. Declaring and Initializing Arrays

Declaring an Array

In C, an array is declared as follows:

data_type array_name[size];

Example:

int scores[10]; // An integer array with 10 elements

Initializing Arrays

You can initialize an array at the time of declaration.

  1. Explicit Initialization
int values[5] = {1, 2, 3, 4, 5};
  1. Partial Initialization
int data[5] = {10, 20}; // Remaining elements are initialized to 0
  1. Omitting Size in Initialization
int numbers[] = {10, 20, 30}; // Size automatically set to 3

Note on Uninitialized Arrays

Using an array without initialization may result in unpredictable values (garbage data). It’s recommended to initialize arrays where appropriate.

4. How to Get the Length (Number of Elements) of an Array

In C, accurately determining the length (number of elements) of an array is essential. Especially in loop operations or data management, knowing the array size is necessary. In this section, we’ll explain specific methods and important considerations.

4.1 Using the sizeof Operator

The most common way to get the length of an array is by using the sizeof operator. sizeof returns the size of a data type or variable in bytes.

Basic Code Example:

#include <stdio.h>

int main() {
    int array[5] = {10, 20, 30, 40, 50};
    int length = sizeof(array) / sizeof(array[0]); // Calculate number of elements

    printf("Array length: %d\n", length); // Output: 5
    return 0;
}

Key Points:

  • sizeof(array) – Gets the total byte size of the array.
  • sizeof(array[0]) – Gets the byte size of the first element.
  • Divide the total size by the element size to get the number of elements.

4.2 Passing Arrays to Functions

When you pass an array to a function, it is converted into a pointer. Therefore, using sizeof inside the function will return the pointer size (often 4 or 8 bytes), not the actual number of elements.

Problem Example:

#include <stdio.h>

void printArrayLength(int arr[]) {
    printf("Size: %ld\n", sizeof(arr) / sizeof(arr[0])); // Incorrect result
}

int main() {
    int array[5] = {1, 2, 3, 4, 5};
    printArrayLength(array);
    return 0;
}

Solution:
Pass the length as a separate argument.

Corrected Example:

#include <stdio.h>

void printArrayLength(int arr[], int length) {
    printf("Array length: %d\n", length);
}

int main() {
    int array[5] = {1, 2, 3, 4, 5};
    int length = sizeof(array) / sizeof(array[0]);
    printArrayLength(array, length);
    return 0;
}

5. Getting the Length of a String Array

In C, strings are also handled as arrays. However, unlike numeric arrays, strings are char arrays with a special null terminator '\0' at the end. This section explains how to get the length of a string array and important points to note.

5.1 Relationship Between Strings and Arrays

A string is essentially a collection of characters stored in a char array. For example:

char str[] = "Hello";

This is stored in memory as:

Hello‘\0’

Key Points:

  • '\0' marks the end of the string.
  • The array size is 6 bytes, including the null terminator.

5.2 Using strlen to Get String Length

To get the number of characters in a string, use the standard library function strlen.

Example:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello";
    printf("String length: %ld\n", strlen(str)); // Output: 5
    return 0;
}

Note:

  • strlen counts characters dynamically and does not include the null terminator '\0'.

5.3 Difference Between sizeof and strlen

You can also use sizeof to get a string’s length, but the result differs from strlen.

Example:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello";
    printf("sizeof: %ld\n", sizeof(str));  // Output: 6 (includes '\0')
    printf("strlen: %ld\n", strlen(str)); // Output: 5 (excludes '\0')
    return 0;
}

Differences:

  • sizeof returns the total size of the array (including null terminator).
  • strlen returns only the character count (excluding null terminator).

6. Handling Variable Length Arrays (VLA)

Starting from the C99 standard, C introduced Variable Length Arrays (VLA). This feature allows you to determine the size of an array at runtime instead of at compile time. In this section, we’ll cover what VLAs are, how to use them, and important considerations.

6.1 What is a Variable Length Array?

Standard arrays are static arrays whose size is fixed at compile time. In contrast, a VLA is a dynamic array determined at runtime, allowing flexible sizing based on user input or calculation results.

Example of a Static Array:

int arr[10]; // Size fixed at compile time

Example of a Variable Length Array:

int size;
scanf("%d", &size); // Size determined at runtime
int arr[size];      // Array allocated at runtime

6.2 Basic Usage of VLAs

The following example creates an array based on the user’s input and processes its elements:

#include <stdio.h>

int main() {
    int n;

    printf("Enter array size: ");
    scanf("%d", &n); // Determine size at runtime

    int arr[n]; // Declare VLA

    // Input data into the array
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    // Display array contents
    printf("Array elements: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

Example Output:

Enter array size: 5
Array elements: 1 2 3 4 5

Key Points:

  1. Allows dynamic sizing for more flexible data management.
  2. Size doesn’t have to be known at program start — it can be decided during execution.

7. Important Notes About Array Length

In C, managing the size (length) of arrays is critical. Incorrect handling can cause unexpected behavior or severe security issues. This section covers key points for safe coding practices regarding array length.

7.1 Preventing Out-of-Bounds Access

Arrays have fixed sizes. Accessing beyond the specified range can cause undefined behavior or crashes.

Example: Out-of-Bounds Access

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};

    for (int i = 0; i <= 5; i++) { // Incorrect loop condition
        printf("%d\n", arr[i]);  // Out-of-bounds access
    }

    return 0;
}

Prevention:

  • Use correct loop conditions
for (int i = 0; i < 5; i++) { // Correct condition
    printf("%d\n", arr[i]);
}
  • Use dynamic size calculation
int length = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < length; i++) {
    printf("%d\n", arr[i]);
}

7.2 Buffer Overflow Risks

A common issue from poor array size management is buffer overflow — writing data beyond an array’s allocated memory, which can overwrite other memory areas.

Example: Buffer Overflow

#include <stdio.h>
#include <string.h>

int main() {
    char buffer[10]; // 10 bytes
    strcpy(buffer, "This string is too long!"); // Exceeds buffer size
    printf("%s\n", buffer);
    return 0;
}

Prevention:

  • Use safer functions
strncpy(buffer, "This string is too long!", sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0'; // Ensure null terminator

8. Summary

In this article, we covered everything from the basics to advanced concepts for determining the length of arrays in C. Arrays are powerful data structures, but if not handled correctly, they can lead to program errors or serious security risks. Here, we’ll review the main points and provide practical advice for safe and efficient coding.

8.1 Recap

  1. Basic Concepts, Declaration, and Initialization
  • Arrays store multiple elements of the same type in contiguous memory, and their size is specified at declaration.
  • You can omit the size when initializing, and use flexible initialization techniques.
  1. How to Get Array Length
  • For static arrays, use the sizeof operator to calculate length.
  • When passing arrays to functions, pass the length as a separate parameter.
  1. Getting String Length
  • For strings, use the strlen function to get character count, and understand how it differs from sizeof.
  • For multi-dimensional arrays, handle each string separately.
  1. Handling Variable Length Arrays (VLA)
  • VLAs allow runtime size specification, but watch for stack overflow and compiler compatibility issues.
  • Consider using malloc for dynamic memory allocation when needed.
  1. Precautions for Array Length and Safe Coding
  • Prevent out-of-bounds access and buffer overflows by validating sizes and using safe functions.
  • When using dynamic memory, always pair allocation with free().

8.2 Next Steps

  1. Run the Sample Code to Deepen Understanding
  • Compile and execute the examples from this article to confirm the results.
  1. Try Advanced Exercises
  • Create programs using multi-dimensional arrays or pointers to gain deeper knowledge.
  1. Continue Practicing Safe Coding
  • Always consider security and error handling when designing programs.

8.3 Final Thoughts

Arrays are fundamental yet versatile in C programming. By applying the techniques explained here, you can write safe, efficient, and reliable programs.

Frequently Asked Questions (FAQ)

Q1: Why doesn’t sizeof work correctly for arrays inside functions?

A:
The sizeof operator returns the total size of the array only when the array is defined in the current scope. When you pass an array to a function, it decays into a pointer. A pointer only holds the address of the first element, so sizeof returns the pointer size (4 or 8 bytes), not the array length.

Solution: Pass the array length as a separate argument.

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d\n", arr[i]);
    }
}

int main() {
    int array[5] = {1, 2, 3, 4, 5};
    printArray(array, sizeof(array) / sizeof(array[0]));
    return 0;
}

Q2: For string length, should I use sizeof or strlen?

A:
It depends on the purpose:

  • sizeof: Gets the total byte size of the array, including the null terminator. Useful for checking buffer size.
  • strlen: Gets the number of characters (excluding the null terminator). Use when you need the string length.

Example:

char str[] = "Hello";
printf("%ld\n", sizeof(str));  // 6 (includes '\0')
printf("%ld\n", strlen(str)); // 5 (excludes '\0')

Q3: Should I use VLAs or malloc for dynamic arrays?

A:
It depends on your needs:

  • VLAs – Convenient and allow runtime sizing, but use stack memory and may cause stack overflow for large sizes. Not supported in some C11 environments.
  • malloc – Uses heap memory, suitable for large datasets, more portable, and safer for long-term use (with proper memory management).

Q4: What happens if I forget to free memory allocated with malloc?

A:
Forgetting to free dynamically allocated memory causes a memory leak. Over time, this can slow down or crash the program.

Solution: Always use free() after you’re done with the memory.

int *arr = malloc(10 * sizeof(int));
if (arr == NULL) {
    printf("Memory allocation failed\n");
    return 1;
}

// ... use arr ...

free(arr); // Free memory

Q5: How can I prevent buffer overflows?

A:
Buffer overflows occur when writing beyond an array’s allocated size. To prevent them:

  1. Check array sizes before writing data
  2. Use safe functions – e.g., use strncpy instead of strcpy, snprintf instead of sprintf
  3. Allocate extra space – For strings, account for the null terminator
  4. Test edge cases – Perform boundary value testing

Conclusion

This FAQ addressed common questions and pitfalls related to determining array length in C. Use this guide alongside the main article to build safe and efficient programs.

侍エンジニア塾