C sizeof a passed array
There is no magic solution. C is not a reflective language. Objects don't automatically know what they are.
But you have many choices:
- Obviously, add a parameter
- Wrap the call in a macro and automatically add a parameter
- Use a more complex object. Define a structure which contains the dynamic array and also the size of the array. Then, pass the address of the structure.
Using sizeof() on an array passed to a function
Array in C always passed by reference. Thats why you are getting pointer size each time, not actual size.
To work with array in C as an argument, you should pass size of array with array.
I modified your program to working condition:
typedef unsigned char BYTE;
void checkArraySize(BYTE data[], int sizeOfArray)
{
int internalSize = sizeOfArray;
printf("%d", internalSize );
}
void main(void)
{
BYTE data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
int externalSize = sizeof(data)/sizeof(BYTE); //it would return number of elements in array
checkArraySize(data, externalSize);
}
passed by reference means only address of first element of array is sent. If you change anything even inside function checkArraySize, this change would be reflected to original array too. Check modified above example.
typedef unsigned char BYTE;
void checkArraySize(BYTE data[])
{
int internalSize = sizeof(data);
printf("%d\n", internalSize );
data[3]= 0x02; //internalSize is reported as 4
}
void main(void)
{
BYTE data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
int externalSize = sizeof(data); //externalSize is reported as 8
printf("Value before calling function: 0x%x\n",data[3]);
checkArraySize(data);
printf("Value after calling function: 0x%x\n",data[3]);
}
output would be:
Value before calling function: 0x4
4
Value after calling function: 0x2
How do I determine the size of my array in C?
Executive summary:
int a[17];
size_t n = sizeof(a)/sizeof(a[0]);
Full answer:
To determine the size of your array in bytes, you can use the sizeof
operator:
int a[17];
size_t n = sizeof(a);
On my computer, ints are 4 bytes long, so n is 68.
To determine the number of elements in the array, we can divide
the total size of the array by the size of the array element.
You could do this with the type, like this:
int a[17];
size_t n = sizeof(a) / sizeof(int);
and get the proper answer (68 / 4 = 17), but if the type ofa
changed you would have a nasty bug if you forgot to change
the sizeof(int)
as well.
So the preferred divisor is sizeof(a[0])
or the equivalent sizeof(*a)
, the size of the first element of the array.
int a[17];
size_t n = sizeof(a) / sizeof(a[0]);
Another advantage is that you can now easily parameterize
the array name in a macro and get:
#define NELEMS(x) (sizeof(x) / sizeof((x)[0]))
int a[17];
size_t n = NELEMS(a);
Find the Size of integer array received as an argument to a function in c
You cannot do it that way. When you pass an array to a function, it decays into a pointer to the first element, at which point knowledge of its size is lost.
If you want to know the size of an array passed to the function, you need to work it out before decay and pass that information with the array, something like:
void function (size_t sz, int *arr) { ... }
:
{
int x[20];
function (sizeof(x)/sizeof(*x), x);
}
Forcing an array size in a function parameter in C when passing an array
If you pass a pointer to the array instead of a pointer to its first element, you will get an incompatible pointer warning:
void foo(int (*bar)[42])
{}
int main(void)
{
int a[40];
foo(&a); // warning: passing argument 1 of 'foo' from incompatible pointer type [-Werror=incompatible-pointer-types]
// note: expected 'int (*)[42]' but argument is of type 'int (*)[40]'
int b[45];
foo(&b); // warning: passing argument 1 of 'foo' from incompatible pointer type [-Werror=incompatible-pointer-types]
// note: expected 'int (*)[42]' but argument is of type 'int (*)[45]'
}
Compile with -Werror
to make it an error.
godbolt
C - passing array in function an get its size
In C you must pass in not only the array, which decays to a pointer, but the size of the array as well. In C the common convention is (array, size):
void print_array(int a[], size_t s) {
for (size_t i = 0; i < s; ++i) {
... a[i] ...
}
}
Where you call it like:
print_array(a, 5);
The length of array changes after passing it a function
int passing_array(int array[]) {
int size = sizeof(array);
printf("The size after passing: %d\n", size);
}
is the same as
int passing_array(int* array) {
int size = sizeof(array);
printf("The size after passing: %d\n", size);
}
Hence, size
is the size of a pointer.
c array size's change when used inside a function
Of course.
The first is the size of the declared variable
int numbers_array[] = {10, 20, 30, 40, 50, 10, 60, 2500, 25555}
its size is well known even at compile time: 9 elements * 4 bytes each = 36 bytes
The second is the size of a pointer to an integer, 8 bytes (64 bits addressing)
The point is that the function has no way of knowing the size of its array parameter at any time. Since arrays are pointers, it will always and only see a pointer.
The following
int max_number(int numbers_array[])
is equivalent to
int max_number(int *numbers_array)
Related Topics
How to Convert Char* to Wchar_T*
Efficient 128-Bit Addition Using Carry Flag
Error When Compiling Some Simple C++ Code
How to Force a Static Member to Be Initialized
Difference Between Pointer and Reference as Thread Parameter
How Is the Size of a C++ Class Determined
Is the Behaviour of I = I++ Really Undefined
G++ Linking Order Dependency When Linking C Code to C++ Code
Size of Array Passed to C++ Function
C++ Overload Static Function with Non-Static Function
Sequence Points and Partial Order
Execute a Process from Memory Within Another Process
How to Correctly Interpose Malloc Allowing for Ld_Preload Chaining