Почему размер массива не отправлен в качестве параметра то же как в основном?
#include <stdio.h>
void PrintSize(int p_someArray[10]);
int main () {
int myArray[10];
printf("%d\n", sizeof(myArray)); /* As expected, 40 */
PrintSize(myArray);/* Prints 4, not 40 */
}
void PrintSize(int p_someArray[10]){
printf("%d\n", sizeof(p_someArray));
}
Тип массива - это неявно преобразуется в тип указателя при передаче его в функцию.
Таким образом,
void PrintSize(int p_someArray[10]) {
printf("%zu\n", sizeof(p_someArray));
}
и
void PrintSize(int *p_someArray) {
printf("%zu\n", sizeof(p_someArray));
}
эквивалентны. Таким образом, вы получаете значение sizeof(int*)
Массивы имеют только свободные размеры. По большей части массив является указателем на память. Размер в объявлении говорит компилятору только о том, сколько памяти выделять для массива - он не связан с типом, поэтому sizeof() продолжать нечего.
.Поведение по замыслу.
Один и тот же синтаксис в объявлении параметров функции означает совершенно иную вещь, чем в определении локальной переменной.
Причина описана в других ответах.
.В языке Си нет метода определения размер неизвестного массива, поэтому количество должно быть передается так же, как и указатель на первый элемент.
Нельзя передавать массивы в функции.
Если вы действительно хотите распечатать размер, вы можете передать указатель на массив, но это будет совсем не универсально, так как нужно определить размер массива и для функции.
#include <stdio.h>
void PrintSize(int (*p_anArray)[10]);
int main(void) {
int myArray[10];
printf("%d\n", sizeof(myArray)); /* as expected 40 */
PrintSize(&myArray);/* prints 40 */
}
void PrintSize(int (*p_anArray)[10]){
printf("%d\n", (int) sizeof(*p_anArray));
}
Потому что массивы распадаются на указатели, когда они передаются в качестве параметров. Так работает Си, хотя в С++ можно передавать "массивы" по ссылке и преодолевать эту проблему. Обратите внимание, что к этой функции можно передавать массивы различного размера:
// 10 is superfluous here! You can pass an array of different size!
void PrintSize(int p_someArray[10]);
Как утверждают другие, при использовании массивов в качестве параметров функции они распадаются до указателя на свой первый элемент. Стоит также отметить, что sizeof не оценивает выражение и не требует круглых скобок при использовании с выражением, поэтому ваш параметр на самом деле вообще не используется, поэтому вы также можете записать sizeof с типом, а не со значением.
#include <stdio.h>
void PrintSize1 ( int someArray[][10] );
void PrintSize2 ( int someArray[10] );
int main ()
{
int myArray[10];
printf ( "%d\n", sizeof myArray ); /* as expected 40 */
printf ( "%d\n", sizeof ( int[10] ) ); /* requires parens */
PrintSize1 ( 0 ); /* prints 40, does not evaluate 0[0] */
PrintSize2 ( 0 ); /* prints 40, someArray unused */
}
void PrintSize1 ( int someArray[][10] )
{
printf ( "%d\n", sizeof someArray[0] );
}
void PrintSize2 ( int someArray[10] )
{
printf ( "%d\n", sizeof ( int[10] ) );
}
Это указатель, поэтому передача размера массива в качестве второго параметра в функцию
является обычной реализацией.Таким образом, вам нужно будет передать длину массива в качестве второго параметра. Когда вы пишете код, в котором вы оба объявляете массив константного размера, а затем передаете этот массив в функцию, очень больно, когда константа длины массива показывает несколько мест в вашем коде...
K&R на помощь:
#define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0]))
Так что теперь вы можете сделать e. g:
int a[10];
...
myfunction(a, N_ELEMENTS(a));
В C ++ вы можете передать массив по ссылке именно для этой цели:
void foo(int (&array)[10])
{
std::cout << sizeof(array) << "\n";
}