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

Определение размера массива + sizeof

25.01.2012, 16:52. Показов 86782. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Массив из 6 чисел: sizeof возвращает 24 байта. Тот же массив вызван функцией возвращает только 4 байта.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
void Qut1(int[]);
 
int main()
{
    int Array[]={10,8,6,4,2,0};
    cout<<"Sizeof_Array= "<<sizeof Array<<endl;  //ответ 24
    Qut1(Array);
    
    return 0;
}
 
void Qut1(int arr[])
{
 
    cout<<'\n';
 
    cout <<"Sizeof_Array_in_Function= "<< sizeof arr<<'\n'<<endl;// ответ 4
}
Ниже пример из С.В.Глушаков «Программирование С++» стр. 129. Программа должна выводить все числа массива, но "sizeof(arr)" функции Qut1 равно 4, и естественно выводит только 4 числа. Ошибка в книге или я ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
void Qut1(int[]);
 
int main()
{
    int Array[]={10,8,6,4,2,0};
 
    Qut1(Array);
   
    return 0;
}
 
void Qut1(int arr[])
{
    for (int i=0; i<sizeof(arr); i++)
    cout <<arr[i]<<" "<<endl;
 
        
}
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.01.2012, 16:52
Ответы с готовыми решениями:

Определение размера массива
Привет всем у меня несколько вопросов по языку си (компилятор gcc). 1) Есть, например след код: char* sym; char c = 'a'; ...

Определение размера массива
Код: template &lt;class T,int N&gt; int arr_sz(T (&amp;arr)) {return N;} void sum(int a){cout&lt;&lt;a;}; int main() {

Определение размера массива в функции
Всем доброго дня ! Подскажите пожалуйста, как можно определить размер массива в функции ? запись int n = sizeof(a)/sizeof(int);...

19
277 / 150 / 25
Регистрация: 05.11.2011
Сообщений: 429
Записей в блоге: 1
25.01.2012, 16:56
Diaskop, в функцию передается указатель.

Не по теме:

книгу с таким примером выброси



Передавай в качестве второго параметра длину массива
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
25.01.2012, 17:25
Массив нельзя передать в функцию.
C++
1
void Qut1( int arr[] )
это одно и тоже, что и
C++
1
void Qut1( int arr * )
sizeof( любых указателей ) = 4
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
25.01.2012, 18:01
Diaskop, всё дело в том какой массив статический или динамический.
char StatArr[N];
sizeof(StatArr) - выведет N*sizeof(char) байт
Если массив динамический sizeof всегда возвращает размер указателя в 4 байта...
char * DinArr = new char[N];
sizeof(DinArr) - вернёт четыре байта...
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.01.2012, 23:56
-=ЮрА=-, дело тут не в этом, а в том, что, как и сказали выше, массив передаётся в функцию. В функции он перестаёт (для этой самой функции) быть полноценным статическим массивом (для которого компилятор хранит такую информацию, как размер занимаемой им памяти), а становится обычным указателем.

Цитата Сообщение от Diaskop Посмотреть сообщение
Ниже пример из С.В.Глушаков
О боже, это в книге написано??
0
26.01.2012, 10:20

Не по теме:

silent_1991, что ты хотел сказать я так и не понял...:scratch:
Что в функцию массивы передаются по указателю, ну да открыл для меня страшную тайну:)

0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.01.2012, 11:00
-=ЮрА=-, вы свой предыдущий комментарий не к месту написали. В данном случае без разницы, статический массив изначально или динамический. Проблема в том, что размер пытаются вычислить в функции, в которой что статический массив, что динамический - суть указатель.
0
26.01.2012, 11:12

Не по теме:

silent_1991, лучше расскажу один анекдот
У программиста спросили:
- Каким будет наступающий новый год?
- Целым, положительным...

Попробуй подходить к постам непрямолинейно, думаю научишся улавливать мысли других людей...

0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.01.2012, 11:16
-=ЮрА=-,

Не по теме:

Не учите меня жить! (c) "Двенадцать стульев"


Был задан чёткий вопрос: почему в функции, в которой статический массив создан, sizeof возвращает одно, а в функции, куда он передаётся как параметр, другое. Напрашивается чёткий ответ: ибо указатель. Ваш непрямолинейный динамический массив только собьёт человека с толку.
1
26.01.2012, 11:25

Не по теме:

silent_1991, на счёт прямолинейности вниму!
Впреть ещё конкретней буду излагать мысли, а на счёт этого

Цитата Сообщение от silent_1991 Посмотреть сообщение
Не по теме: Не учите меня жить! (c) "Двенадцать стульев"
- аналогично..!Иногда твои язвы кроме желания что-то нехорошее сделать ничего не вызывают! Кодить не только ты умеешь и книги читать тоже. Будь пожалуйста коректеней в своих уколах особенно в мой адрес...

0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
24.09.2017, 03:05
C++
1
2
int Array[]={10,8,6,4,2,0};
int sizeArray = sizeof(Array)/sizeof(int);
Как это работает..
Тип int занимает в памяти 4байта а значит 4 ячейки по 8 бит. В 4 байта можно записать максимальное число 2^32. Если вы ввели туда число 3, то это будет в памяти вот так 00000000 00000000 00000000 00000011. Следовательно если взять sizeof(Array) то получите 4 байта размера типа int * массив числа зарезервированных ячеек. 4*6=24 а потом делим на размер вашего типа данных int, и получаем сколько в массиве чисел.
3
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
24.09.2017, 04:31
Распространенные ошибки
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
24.09.2017, 08:21
Цитата Сообщение от helena_1990 Посмотреть сообщение
C++
1
int sizeArray = sizeof(Array)/sizeof(int);
а вот так еще лучше
C++
1
int sizeArray = sizeof(Array)/sizeof(Array[0]);
и без разницы какого типа массив
2
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.09.2017, 08:25
Цитата Сообщение от ValeryS Посмотреть сообщение
и без разницы какого типа массив
Начиная с C++17:
C++
1
std::size(arr);
и без разницы, голый массив там или контейнер.
2
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
24.09.2017, 09:03
ValeryS, можно еще так
C++
1
int sizeArray = sizeof(Array)/sizeof(*Array);
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
24.09.2017, 09:45
Цитата Сообщение от Croessmah Посмотреть сообщение
и без разницы, голый массив там или контейнер
Годно!
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
24.09.2017, 09:49
Ferrari F1, размер массива в байтах делим на размер указателя в байтах?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
24.09.2017, 10:27
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
29
30
#include <iostream>
#include <array>
 
template<typename T, size_t N>
char (&arraySizeHelper(const T (&)[N]))[N];
 
#define ARRAY_SIZE(arr) sizeof(arraySizeHelper(arr))
 
template<typename T, size_t N>
constexpr size_t arraySize(const T (&)[N]) noexcept
{ return N; }
 
template <class C> 
constexpr auto size(const C & c) -> decltype(c.size())
{ return c.size(); }
 
template <class T, std::size_t N>
constexpr std::size_t size(const T (&)[N]) noexcept
{ return N; }
 
int main()
{
    int arr[3];
    std::array<int, 5> arr2;
    
    std::cout << ARRAY_SIZE(arr) << "\n";
    std::cout << arraySize(arr) << "\n";
    std::cout << size(arr) << "\n";
    std::cout << size(arr2) << "\n";
}
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.09.2017, 10:49
Цитата Сообщение от ValeryS Посмотреть сообщение
размер массива в байтах делим на размер указателя в байтах?
Нет же.
Он делит на размер результата разыменования. А это размер элемента массива.
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
24.09.2017, 11:27
Цитата Сообщение от DrOffset Посмотреть сообщение
Он делит на размер результата разыменования. А это размер элемента массива.
Пардон
звездочка в заблуждение ввела не так явно как []
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2017, 11:27
Помогаю со студенческими работами здесь

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

Определение размера одномерного массива
Добрый день. Необходимо задать размер одномерного массива. В цикле for стоит переменная - счетчик, которая увеличивается на единицу при...

Определение размера строки массива строк
Здравствуйте! Visual C++ char *my_string={&quot;Это первая строка&quot;, &quot;Это вторая строка&quot;, &quot;Это третья...

Определение размера динамического массива строк
Здравствуйте, столкнулся с проблемой предопределения размера массива строк. Проблема в том, что я не знаю, какой размер мне выделить при...

Определение количества элементов в динамическом массиве оператором sizeof()
Как с помощью sizeof() определить, сколько элементов находится в массиве?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru