How do I determine the size of my array in C?
Categories:
Determining Array Size in C: A Comprehensive Guide

Learn the correct and incorrect ways to find the size of an array in C, understanding the nuances of compile-time vs. run-time sizing and pointer decay.
In C programming, accurately determining the size of an array is a fundamental task that can sometimes be tricky due to how arrays and pointers are handled. Unlike some higher-level languages, C does not store array size information directly with the array itself at runtime when passed to a function. This article will explore the correct methods for calculating array size, common pitfalls, and best practices.
The sizeof
Operator for Statically Allocated Arrays
The sizeof
operator is your primary tool for determining the size of an array in C. When applied to a statically allocated array (an array whose size is known at compile time), sizeof
returns the total number of bytes occupied by the array in memory. To get the number of elements, you divide this total size by the size of a single element.
#include <stdio.h>
int main() {
int arr[] = {10, 20, 30, 40, 50};
char str[] = "Hello";
// Size of the entire integer array in bytes
size_t arr_total_bytes = sizeof(arr);
// Size of a single integer element in bytes
size_t arr_element_bytes = sizeof(arr[0]);
// Number of elements in the integer array
size_t arr_num_elements = arr_total_bytes / arr_element_bytes;
printf("Integer array size: %zu bytes\n", arr_total_bytes);
printf("Number of elements in integer array: %zu\n", arr_num_elements);
// For character arrays (strings), remember the null terminator
size_t str_total_bytes = sizeof(str);
size_t str_element_bytes = sizeof(str[0]);
size_t str_num_elements = str_total_bytes / str_element_bytes;
printf("String array size: %zu bytes (includes null terminator)\n", str_total_bytes);
printf("Number of elements in string array: %zu (includes null terminator)\n", str_num_elements);
printf("String length (excluding null terminator): %zu\n", str_num_elements - 1);
return 0;
}
Using sizeof
to determine array size and element count for statically allocated arrays.
size_t
for variables that store sizes or counts of elements. It's an unsigned integer type guaranteed to be large enough to hold the size of the largest object your system can handle.The Pitfall: Array Decay when Passed to Functions
One of the most common mistakes in C is trying to use sizeof
on an array that has been passed as an argument to a function. When an array is passed to a function, it 'decays' into a pointer to its first element. This means that inside the function, sizeof
will return the size of the pointer itself (typically 4 or 8 bytes on 32-bit or 64-bit systems), not the size of the original array.
flowchart TD A[Array Declaration: `int arr[10];`] B{`sizeof(arr)` in `main()`} C[Result: `10 * sizeof(int)` bytes] D[Function Call: `void func(int arr[]);`] E{Inside `func`, `arr` decays to `int*`} F{`sizeof(arr)` in `func()`} G[Result: `sizeof(int*)` bytes (pointer size)] A --> B B --> C A --> D D --> E E --> F F --> G
Illustration of array decay when passed to a function, affecting sizeof
results.
#include <stdio.h>
void printArraySize(int arr[]) {
// Inside the function, arr is treated as a pointer (int*)
printf("Inside function: sizeof(arr) = %zu bytes (size of pointer)\n", sizeof(arr));
printf("Inside function: Number of elements (INCORRECT) = %zu\n", sizeof(arr) / sizeof(arr[0]));
}
int main() {
int myArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("In main: sizeof(myArray) = %zu bytes (actual array size)\n", sizeof(myArray));
printf("In main: Number of elements = %zu\n", sizeof(myArray) / sizeof(myArray[0]));
printArraySize(myArray); // Passing the array to a function
return 0;
}
Demonstration of array decay and incorrect size calculation within a function.
Correctly Passing Array Size to Functions
To correctly work with arrays in functions, you must explicitly pass the array's size as a separate argument. This is the standard and safest approach in C.
#include <stdio.h>
// Function that correctly accepts an array and its size
void processArray(int arr[], size_t size) {
printf("\nInside processArray function:\n");
printf("Received array size: %zu elements\n", size);
printf("First element: %d\n", arr[0]);
printf("Last element: %d\n", arr[size - 1]);
}
int main() {
int data[] = {100, 200, 300, 400, 500};
size_t data_size = sizeof(data) / sizeof(data[0]);
printf("In main: Array 'data' has %zu elements.\n", data_size);
// Pass both the array and its size to the function
processArray(data, data_size);
return 0;
}
Passing array and its size as separate arguments to a function.
malloc
, calloc
, realloc
), sizeof
on the pointer will always return the size of the pointer, not the allocated memory block. For dynamic arrays, you must keep track of the allocated size yourself.