Некорректная работа функции sizeof()

270
20 февраля 2018, 07:08

В процессе разработки, заметил некорректную работу программы, вынес проблему в отдельный проект.

#include <iostream>
using namespace std;
int getSize(int arr[]) {
    return sizeof(arr);
}
int main() {
    int arr[] = { 1, 2, 3, 4 };
    cout << getSize(arr) << endl; // Вывод: 8
    cout << sizeof(arr) << endl;  // Вывод: 16
    return 0;
}
Answer 1

Вас вводит в заблуждение объявление функции int getSize(int arr[]). arr в нем является обычным указателем, а не массивом. Если хотите получить размер массива, то нужен шаблон, принимающий массив по ссылке:

template<typename T, ::std::size_t items_count> ::std::size_t
getSize(T ( & arr )[items_count])
{
     return sizeof(arr);
}

online compiler

А вообще вместо С-style массивов следует использовать std::array.

Answer 2

для функции getSize имя вашего массива является указателем (ваша функция не знает какой массив вы ей передадите). Поэтому выводится размер указателья. В main() вы имеет определенный массив, и sizeof выдает размер всего массива;

Answer 3

При передаче в функцию int arr[] эквивалентно int *arr, поэтому ты получаешь размер указателя, а не размер массива.

Для Си++ можно сделать так: https://ideone.com/2v0qXE

template <int N> int getSize(int (&arr)[N]) {
    return sizeof(arr);
}

Но вообще гораздо лучше в функцию передавать размер массива, а не пытаться его там вычислить. Ну и ещё для размеров правильнее использовать size_t, а не int.

READ ALSO
С++ вместо 0.0 выводит -0.0

С++ вместо 0.0 выводит -0.0

Сначала вместо нуля выводил экспоненту, поставил в сout setprecision(1) выводит -00 как с этим бороться? И как вместо nan вывести "*"

186
Qt. Динамическое изменение GridView/QSqlQueryModel Qml

Qt. Динамическое изменение GridView/QSqlQueryModel Qml

Здесь я получаю данные с базы данных в мою модель и передаю их в Qml

186
drawText функция печатает в обратном порядке Qt/C++

drawText функция печатает в обратном порядке Qt/C++

печатает цифру в обратно порядке как исправить ?

186