Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.02.2019
Сообщений: 9

Почему в данной функции неправильные значения

11.01.2020, 14:13. Показов 792. Ответов 11

Студворк — интернет-сервис помощи студентам
Здравствуйте, имеется функция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
int Length(int *arr)
{
    return(sizeof(arr)/sizeof(arr[0]));
}
 
int main()
{
    const int SIZE = 10;
    int arr[SIZE];
 
    arr[0] = 0;
    arr[1] = 1;
    arr[2] = 2;
    arr[3] = 3;
    arr[4] = 4;
    arr[5] = 5;
    arr[6] = 6;
    arr[7] = 7;
    arr[8] = 8;
    arr[9] = 9;
 
    Length(arr); //равен 2
    printf("%d \n", sizeof(arr)/sizeof(arr[0])); // равен 10
 
    return 0;
}
Так вот, почему если я эту операцию проделаю в функции, то вернётся 2, а если просто разделю в mian'e, то всё правильно?

Прикол в том, что в функции sizeof(arr) равен не 40 как должно быть, а 8. sizeof(arr[0]) вообще равен 4. Почему? не знаю.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2020, 14:13
Ответы с готовыми решениями:

Почему при проверке заполнения массива выводятся неправильные значения?
// ConsoleApplication15.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include...

Вычислить с заданной точностью значения данной функции
Ребят, очень нужна помощь в решении задачи с помощью вложенных циклов. Суть задачи: Вычислить с заданной точностью значения данной...

Вычислить с заданной точностью значения данной функции на интервале
Вычислить с заданной точностью значения данной функции на интервале от Xнач до Xкон с шагом h, используя разложение функции в степенной...

11
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
11.01.2020, 14:31
The little nigh, в функции Вы получаете размер не массива, а указателя.
А вот в main() компилятор видит массив и высчитывает его размер.

Добавлено через 2 минуты
sizeof(arr[0]) == 4, т.к. это размер int-а, как элемента, адрес которого находится в arr
1
0 / 0 / 0
Регистрация: 25.02.2019
Сообщений: 9
11.01.2020, 14:33  [ТС]
Спасибо это на самом деле объясняет такое поведение, но как тогда это исправить? передать массив как-то так:
const int SIZE = 10;

int Length(int arr[SIZE])
{
...
}
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
11.01.2020, 14:39
The little nigh, это тоже самое
Если нужна длина массива в подпрограмме, передайте явно.
C++
1
2
3
4
int fun(int* arr, int SIZE)
{
...
}
1
Злостный нарушитель
 Аватар для Verevkin
10359 / 5779 / 1275
Регистрация: 12.03.2015
Сообщений: 26,705
11.01.2020, 14:40
Цитата Сообщение от The little nigh Посмотреть сообщение
но как тогда это исправить?
Никак. По одному только указателю размер узнать невозможно. Именно для этого си-строки оканчиваются нулём.
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
11.01.2020, 14:41
Если глобальная константа, то и передавать не надо. И так видна.
0
0 / 0 / 0
Регистрация: 25.02.2019
Сообщений: 9
11.01.2020, 14:43  [ТС]
Большое спасибо, я подумал, что такое решение мне вполне подойдёт:
C++
1
2
3
4
5
6
7
8
int Length(int* arr, int size)
{
    int sum = 0;
    for(int i = 0; i < size; ++i)
        sum++;
    
    return sum;
}
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
11.01.2020, 14:46
The little nigh, ну тогда назовите не int Length(), a что-то типа int CalcSum()
1
Злостный нарушитель
 Аватар для Verevkin
10359 / 5779 / 1275
Регистрация: 12.03.2015
Сообщений: 26,705
11.01.2020, 14:50
Цитата Сообщение от The little nigh Посмотреть сообщение
Большое спасибо, я подумал, что такое решение мне вполне подойдёт
Эта функция не имеет смысла.
0
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
11.01.2020, 14:51
The little nigh,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
 
int Length(int arr[])
{   return(sizeof(arr)/sizeof(arr[0]));
}
 
int main()
{   const int SIZE = 10;
    int arr[SIZE];
 
    arr[0] = 0;
    arr[1] = 1;
    arr[2] = 2;
    arr[3] = 3;
    arr[4] = 4;
    arr[5] = 5;
    arr[6] = 6;
    arr[7] = 7;
    arr[8] = 8;
    arr[9] = 9;
 
    Length(arr); //равен 2
    printf("%d \n", sizeof(arr)/sizeof(arr[0])); // равен 10
 
    return 0;
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
11.01.2020, 15:11
The little nigh,
C++
1
2
3
4
5
6
7
template<class T, size_t N>
constexpr size_t Length(T(&arr)[N])
{
    return N;
}
// или просто используй
std::size(arr);
1
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
11.01.2020, 20:35
А всё это потому что ~40 лет назад люди не могли себе позволить передавать массив целиком
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2020, 20:35
Помогаю со студенческими работами здесь

Вычислить с заданной точностью значения данной функции на интервале
Вычислить с заданной точностью  значения данной функции на интервале...

Построить машину Тьюринга, вычисляющую значения данной функции
Построить машину Тьюринга, вычисляющую значения данных функции. g(x) = 5x

Вычислить с заданной точностью значения данной функции на интервале
Вычислить с заданной точностью значения данной функции на интервале от до с шагом h, используя разложение функции в степенной ряд....

Вычислить с заданной точностью ε значения данной функции на интервале
Вычислить с заданной точностью ε значения данной функции на интервале от Хнач до Хкон с шагом h, используя разложение функции в степенной...

Вычислить с заданной точностью значения данной функции на интервале от до с шагом h
Вычислить с заданной точностью значения данной функции на интервале от до с шагом h, используя разложение функции в степенной ряд....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru