Размер массива передается как параметр функции - PullRequest
0 голосов
/ 15 апреля 2020

Давайте рассмотрим следующий код:

#include <iostream>
using namespace std;

void foo(int * arr)
{
    cout << sizeof(arr) << endl;
}

int main()
{
    int arr[3] = {1, 2, 3};
    cout << sizeof(arr) << endl;
    foo(arr);
}

Поскольку имя массива превращается в указатель на его первый элемент, почему sizeof(arr) внутри foo() возвращает 8 вместо 4?

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

В большинстве случаев размер указателя составляет 8 байт. В вашей системе это размер указателя.

Обратите внимание, что размер указателя, и вы, вероятно, знаете это, не является размером объекта, на который он указывает, или размером типа объекта.

Размер указателя зависит от нескольких факторов, таких как архитектура процессора, компилятор или операционная система.

Обычно это работает, если система 16-разрядная, указатели размера 2 байта, если система 32-битная, размер 4 байта, если 64-битная, то 8 байтов.

1 голос
/ 15 апреля 2020

Аргумент, который вы передаете своей функции, является адресом первого элемента вашего массива. Это означает, что в функции вы видите только адрес массива, который вы объявили внутри основной области видимости. Если вы хотите обрабатывать массив так же, как вы относитесь к нему внутри основной функции, вы должны передать его размер в качестве аргумента. Если ваш массив всегда имеет фиксированный размер, то вам это не нужно. Я хотел бы добавить, что sizeof (arr) никогда не будет возвращать одно и то же значение с основной областью действия.

Результат sizeof (arr) внутри функции является результатом sizeof (int *)

0 голосов
/ 23 апреля 2020

Когда вы присвоили массив указателю и используете оператор sizeof для указателя, sizeof вернет размер указателя (не массива). Таким образом, в функции foo sizeof возвращает int * размер в байтах.

Также вы можете использовать array вместо встроенного массива. array знает размер, но встроенный массив не будет.

Внимание! Размер шрифта зависит от платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...