Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 188, средняя оценка - 4.61
Diaskop
Сообщений: n/a
#1

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

25.01.2012, 16:52. Просмотров 29061. Ответов 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;
 
        
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2012, 16:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определение размера массива + sizeof (C++):

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

Определение размера массива - C++
Код: 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() {

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

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

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

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

19
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
25.01.2012, 16:56 #2
Diaskop, в функцию передается указатель.

Не по теме:

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



Передавай в качестве второго параметра длину массива
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.01.2012, 23:56 #5
-=ЮрА=-, дело тут не в этом, а в том, что, как и сказали выше, массив передаётся в функцию. В функции он перестаёт (для этой самой функции) быть полноценным статическим массивом (для которого компилятор хранит такую информацию, как размер занимаемой им памяти), а становится обычным указателем.

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

Не по теме:

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

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

Не по теме:

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

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

0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.01.2012, 11:16 #9
-=ЮрА=-,

Не по теме:

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


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

Не по теме:

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

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

0
helena_1990
2 / 2 / 1
Регистрация: 23.08.2017
Сообщений: 22
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, и получаем сколько в массиве чисел.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3912 / 2149 / 549
Регистрация: 18.10.2014
Сообщений: 3,756
24.09.2017, 04:31 #12
Распространенные ошибки
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
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]);
и без разницы какого типа массив
1
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,884
Записей в блоге: 3
Завершенные тесты: 1
24.09.2017, 08:25 #14
Цитата Сообщение от ValeryS Посмотреть сообщение
и без разницы какого типа массив
Начиная с C++17:
C++
1
std::size(arr);
и без разницы, голый массив там или контейнер.
2
Ferrari F1
604 / 497 / 100
Регистрация: 27.01.2015
Сообщений: 2,913
Записей в блоге: 1
Завершенные тесты: 1
24.09.2017, 09:03 #15
ValeryS, можно еще так
C++
1
int sizeArray = sizeof(Array)/sizeof(*Array);
1
24.09.2017, 09:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2017, 09:03
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru