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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 66, средняя оценка - 4.71
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
#1

sizeof массива - C++

18.08.2012, 15:40. Просмотров 9104. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void f(float x[])
{ printf("%d\n",sizeof(x)); // Пишет 4 байта (размер элемента массива)
}
 
void f2(float x[125])
{ printf("%d\n",sizeof(x)); // Почему пишет 4 байта, хотя в заголовке указан размер массива?
}
 
int main(int argc, char *argv[], char *env[])
{ float Arr[]={1,2,3,4,5,6,7,8};
  f(Arr);
  f2(Arr);
  printf("%d\n",sizeof(Arr)); // Пишет размер всего массива
  return 0;
}
В f() и main() всё правильно и понятно. Почему в f2(), где у массива x явно указан размер, sizeof выдаёт всёравно размер элемента, а не размер всего массива как в main().
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2012, 15:40     sizeof массива
Посмотрите здесь:

Определение размера массива + sizeof C++
sizeof C++
sizeof( char * ) & sizeof(char) C++
C++ Operator sizeof
sizeof() C++
Sizeof выражение C++
Почему sizeof массива char равно 4? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17381 / 5619 / 350
Регистрация: 30.03.2009
Сообщений: 15,398
Записей в блоге: 26
18.08.2012, 15:42     sizeof массива #2
Отличие char *argv[] от char ** argv
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
18.08.2012, 15:58     sizeof массива #3
skvor, одна из странных особенностей языка - массив в параметре функции интерпретируется только как указатель
единственный вариант, когда будет возвращаться правильный размер -

C++
1
2
3
void f (int (&arr)[5] ) {
  std::cout << sizeof(arr) << std::endl;
}
при передаче массива по ссылке
но вообще проще сделать

C++
1
2
3
4
5
typedef int Array[5];
 
void f(Array arr) {
  std::cout << sizeof(Array) << std::endl;
}
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.08.2012, 16:34     sizeof массива #4
Цитата Сообщение от alex_x_x Посмотреть сообщение
но вообще проще сделать

C++
1
2
3
4
5
typedef int Array[5];
 
void f(Array arr) {
  std::cout << sizeof(Array) << std::endl;
}
typedef не создаёт типы.
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 <iostream>
 
typedef double Array[5];
 
void f(Array arr)
{
  std::cout << "f: "                    << std::endl
            << "  arr: " << sizeof(arr) << std::endl;
}
 
int main()
{
  Array x;
  double y[10];
  double *z = new double[200];
  std::cout << "double: "    << sizeof(double)    << std::endl
            << "double*: "   << sizeof(double*)   << std::endl
            << "Array: "     << sizeof(Array)     << std::endl
            << "double[5]: " << sizeof(double[5]) << std::endl
            << "x: "         << sizeof(x)         << std::endl
            << "y: "         << sizeof(y)         << std::endl
            << "z: "         << sizeof(z)         << std::endl;
  f(x);
  f(y);
  f(z);
}
Внутрь всё равно передаётся как указатель.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
18.08.2012, 16:40     sizeof массива #5
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
typedef не создаёт типы.
а я не знал
речь идет о том, что размер будет вычислен как ожидается

все в следствии того, sizeof(param) будет возвращать размер указателя, а sizeof(Array) - типа
softmob
1248 / 698 / 155
Регистрация: 20.02.2010
Сообщений: 1,035
18.08.2012, 20:16     sizeof массива #6
вариант на шаблонах
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
template <typename T, unsigned N> 
void f(T (&v)[N]) 
{
    std::cout << sizeof v << std::endl;
}
 
int main(void)
{
    bool used[1024];
    f(used);
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2012, 23:18     sizeof массива
Еще ссылки по теме:

C++ Sizeof глючит ?
Sizeof C++
C++ Fwrite (buffer , sizeof(char), sizeof(buffer), pFile)
C++ Sizeof(.) или constexpr size_t tmp = sizeof(.)
Sizeof структуры C++

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

Или воспользуйтесь поиском по форуму:
Catstail
Модератор
22301 / 10706 / 1741
Регистрация: 12.02.2012
Сообщений: 17,777
18.08.2012, 23:18     sizeof массива #7
Цитата Сообщение от alex_x_x Посмотреть сообщение
skvor, одна из странных особенностей языка - массив в параметре функции интерпретируется только как указатель
- если вдуматься, не такая уж и странная. В С/С++ для массивов не создаются дополнительные структуры. Поэтому и выход индексов за границу описания в C/С++ не контролируется (и не может).
Yandex
Объявления
18.08.2012, 23:18     sizeof массива
Ответ Создать тему
Опции темы

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