﻿# V511\. The sizeof\(\) operator returns pointer size instead of array size\.

Оператор 'sizeof' возвращает размер указателя, а не массива, для случаев, когда массив был передан в функцию по копии\.

Есть особенность языка, о которой легко забыть и допустить ошибку\. Рассмотрим фрагмент кода:

```cpp
char A[100];
void Foo(char B[100])
{
}
```

В этом коде объект A является массивам и выражение sizeof\(A\) вернет значение 100\.

Объект B является просто указателем\. Значение 100 в квадратных скобках подсказывает программисту, что он работает с массивом из ста элементов\. Но в функцию передается вовсе не массив из ста элементов, а только указатель\. Таким образом выражение sizeof\(B\) будет возвращать значение 4 или 8 \(размер указателя в 32\-битной/64\-битной системе\)\.

Предупреждение V511 выдается в том случае, когда вычисляется размер указателя переданного в качестве аргумента в формате "имя\_типа имя\_массива\[N\]"\. Такой код с высокой вероятностью содержит ошибку\. Рассмотрим пример:

```cpp
void Foo(float array[3])
{
  size_t n = sizeof(array) / sizeof(array[0]);
  for (size_t i = 0; i != n; i++)
    array[i] = 1.0f;
}
```

Функция заполнит значением 1\.0f не весь массив, а только 1 или 2 элемента, в зависимости от разрядности системы\.

В Win32: sizeof\(array\) / sizeof\(array\[0\]\) \= 4/4 \= 1\.

В Win64: sizeof\(array\) / sizeof\(array\[0\]\) \= 8/4 \= 2\.

Для предотвращения подобных ошибок необходимо явно передавать размер массива\. Корректный код:

```cpp
void Foo(float *array, size_t arraySize)
{
  for (size_t i = 0; i != arraySize; i++)
    array[i] = 1.0f;
}
```

Другой вариант, это использовать ссылку на массив:

```cpp
void Foo(float (&array)[3])
{
  size_t n = sizeof(array) / sizeof(array[0]);
  for (size_t i = 0; i != n; i++)
    array[i] = 1.0f;
}
```