Diaskop
1

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

25.01.2012, 16:52. Показов 83373. Ответов 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;
 
        
}
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2012, 16:52
Ответы с готовыми решениями:

Определение размера массива
Привет всем у меня несколько вопросов по языку си (компилятор gcc). 1) Есть, например след код:...

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

Определение размера массива в функции
Всем доброго дня ! Подскажите пожалуйста, как можно определить размер массива в функции ? ...

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

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

Не по теме:

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



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

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

Не по теме:

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

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

Не по теме:

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

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

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

Не по теме:

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


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

Не по теме:

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

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

0
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
24.09.2017, 03:05 11
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Эксперт С++
10816 / 5839 / 1583
Регистрация: 18.10.2014
Сообщений: 14,492
24.09.2017, 04:31 12
Распространенные ошибки
0
Модератор
Эксперт по электронике
8782 / 6568 / 891
Регистрация: 14.02.2011
Сообщений: 23,065
24.09.2017, 08:21 13
Цитата Сообщение от helena_1990 Посмотреть сообщение
C++
1
int sizeArray = sizeof(Array)/sizeof(int);
а вот так еще лучше
C++
1
int sizeArray = sizeof(Array)/sizeof(Array[0]);
и без разницы какого типа массив
2
Неэпический
17806 / 10577 / 2042
Регистрация: 27.09.2012
Сообщений: 26,590
Записей в блоге: 1
24.09.2017, 08:25 14
Цитата Сообщение от ValeryS Посмотреть сообщение
и без разницы какого типа массив
Начиная с C++17:
C++
1
std::size(arr);
и без разницы, голый массив там или контейнер.
2
804 / 531 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
24.09.2017, 09:03 15
ValeryS, можно еще так
C++
1
int sizeArray = sizeof(Array)/sizeof(*Array);
1
Модератор
Эксперт CЭксперт С++
5107 / 2292 / 333
Регистрация: 20.02.2013
Сообщений: 5,645
Записей в блоге: 19
24.09.2017, 09:45 16
Цитата Сообщение от Croessmah Посмотреть сообщение
и без разницы, голый массив там или контейнер
Годно!
0
Модератор
Эксперт по электронике
8782 / 6568 / 891
Регистрация: 14.02.2011
Сообщений: 23,065
24.09.2017, 09:49 17
Ferrari F1, размер массива в байтах делим на размер указателя в байтах?
0
Любитель чаепитий
3734 / 1793 / 563
Регистрация: 24.08.2014
Сообщений: 5,998
Записей в блоге: 1
24.09.2017, 10:27 18
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
16739 / 9080 / 2224
Регистрация: 30.01.2014
Сообщений: 15,817
24.09.2017, 10:49 19
Цитата Сообщение от ValeryS Посмотреть сообщение
размер массива в байтах делим на размер указателя в байтах?
Нет же.
Он делит на размер результата разыменования. А это размер элемента массива.
1
Модератор
Эксперт по электронике
8782 / 6568 / 891
Регистрация: 14.02.2011
Сообщений: 23,065
24.09.2017, 11:27 20
Цитата Сообщение от DrOffset Посмотреть сообщение
Он делит на размер результата разыменования. А это размер элемента массива.
Пардон
звездочка в заблуждение ввела не так явно как []
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2017, 11:27
Помогаю со студенческими работами здесь

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

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

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

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

Sizeof(.) или constexpr size_t tmp = sizeof(.)
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности?...

sizeof массива
void f(float x) { printf(&quot;%d\n&quot;,sizeof(x)); // Пишет 4 байта (размер элемента массива) } void...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru