Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Behaviour of Sizeof in C

Tags:

arrays

c

sizeof

I have learnt that when we pass the array name to sizeof, the name of the array does not decay to the pointer to base address. The code below verifies this fact by giving answer 10.

#include <stdio.h> 

int main(){  
    int arr[10];  
    printf("Size of array is %d" , sizeof(arr)/sizeof(int));  
    return 0;  
}

However when I run the code below, the answer comes 1. Irrespective of whether a dimension is written in prototype or not , the answer is 1. Why is it so ?

#include <stdio.h>

void dimension(int arr[]){  
    printf("Sizof array is %d" , sizeof(arr)/sizeof(int));  
}


int main(){  
    int arr[10];  
    dimension(arr);  
    return 0;  
}  
like image 911
Pritpal Avatar asked Jul 25 '11 08:07

Pritpal


4 Answers

This signature

void dimension(int arr[])

is absolutely equivalent to

void dimension(int *arr)

See also Question 6.4

like image 186
unkulunkulu Avatar answered Sep 28 '22 19:09

unkulunkulu


Because you pass an array of unknown size which is equivalent to a pointer in this context. sizeof is calculated at compile time, not runtime.

like image 30
littleadv Avatar answered Sep 28 '22 19:09

littleadv


When array is passed to a function, it is passed as a pointer, not an array, so the sizeof(arr) will return sizeof(int *)

like image 33
MByD Avatar answered Sep 28 '22 18:09

MByD


In

void dimension(int arr[]){  
    printf("Sizof array is %d" , sizeof(arr)/sizeof(int));  
}

arr[] decays to a pointer, therefore you have the equivalent of

printf("Sizof array is %d" , sizeof(int*)/sizeof(int));

and because on your platform, sizeof(int*) == sizeof(int), you receive 1 as the result.

Note however, that for variable length arrays, sizeof becomes a runtime operation:

int main () {
    int i = ...;
    int x[i];
    printf("number of elements: %d", sizeof (x) / size(*x));
}
like image 33
Sebastian Mach Avatar answered Sep 28 '22 18:09

Sebastian Mach