Почему размер параметра массива не является тем же как в основном?

Почему размер массива не отправлен в качестве параметра то же как в основном?

#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));
}
101
задан Lundin 22 May 2017 в 08:32
поделиться

10 ответов

Тип массива - это неявно преобразуется в тип указателя при передаче его в функцию.

Таким образом,

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*)

100
ответ дан 24 November 2019 в 04:43
поделиться

Массивы имеют только свободные размеры. По большей части массив является указателем на память. Размер в объявлении говорит компилятору только о том, сколько памяти выделять для массива - он не связан с типом, поэтому sizeof() продолжать нечего.

.
-3
ответ дан 24 November 2019 в 04:43
поделиться

Поведение по замыслу.

Один и тот же синтаксис в объявлении параметров функции означает совершенно иную вещь, чем в определении локальной переменной.

Причина описана в других ответах.

.
0
ответ дан 24 November 2019 в 04:43
поделиться

В языке Си нет метода определения размер неизвестного массива, поэтому количество должно быть передается так же, как и указатель на первый элемент.

3
ответ дан 24 November 2019 в 04:43
поделиться

Нельзя передавать массивы в функции.

Если вы действительно хотите распечатать размер, вы можете передать указатель на массив, но это будет совсем не универсально, так как нужно определить размер массива и для функции.

#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));
}
3
ответ дан 24 November 2019 в 04:43
поделиться

Потому что массивы распадаются на указатели, когда они передаются в качестве параметров. Так работает Си, хотя в С++ можно передавать "массивы" по ссылке и преодолевать эту проблему. Обратите внимание, что к этой функции можно передавать массивы различного размера:

 // 10 is superfluous here! You can pass an array of different size!
void PrintSize(int p_someArray[10]);
5
ответ дан 24 November 2019 в 04:43
поделиться

Как утверждают другие, при использовании массивов в качестве параметров функции они распадаются до указателя на свой первый элемент. Стоит также отметить, что 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] ) );
}
16
ответ дан 24 November 2019 в 04:43
поделиться

Это указатель, поэтому передача размера массива в качестве второго параметра в функцию

является обычной реализацией.
18
ответ дан 24 November 2019 в 04:43
поделиться

Таким образом, вам нужно будет передать длину массива в качестве второго параметра. Когда вы пишете код, в котором вы оба объявляете массив константного размера, а затем передаете этот массив в функцию, очень больно, когда константа длины массива показывает несколько мест в вашем коде...

K&R на помощь:

#define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0])) 

Так что теперь вы можете сделать e. g:

int a[10];
...
myfunction(a, N_ELEMENTS(a));
12
ответ дан 24 November 2019 в 04:43
поделиться

В C ++ вы можете передать массив по ссылке именно для этой цели:

void foo(int (&array)[10])
{
    std::cout << sizeof(array) << "\n";
}
4
ответ дан 24 November 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: