﻿# V123\. Allocation of memory by the pattern "\(X\*\)malloc\(sizeof\(Y\)\)" where the sizes of X and Y types are not equal\.


> Это правило входит в группу "Диагностика 64\\\-битных ошибок"\\\. Разработка правил этой группы больше не ведётся, и в будущем они могут быть отключены\\\. Если вы используете эти правила, \[свяжитесь с нашей поддержкой\]\(https://pvs\-studio\.ru/ru/about\-feedback/\) — мы поможем найти замену или предложим альтернативное решение\\\.

Анализатор обнаружил потенциально возможную ошибку, связанную с операцией выделения памяти\. При вычислении размера выделяемой памяти используется оператор sizeof\(X\)\. Результат, возвращаемый функцией выделения памяти, приводится не к "\(X \*\)", а к другому типу "\(Y \*\)"\. Это может свидетельствовать о выделении недостаточного или излишнего количества памяти\.

Рассмотрим первый пример:

```cpp
int **ArrayOfPointers = (int **)malloc(n * sizeof(int));
```

Здесь из\-за опечатки в 64\-битной программе будет выделяться в два раза меньше памяти, чем это необходимо\. В 32\-битной программе размер типа int и указателя на тип int совпадает и программа, несмотря на опечатку, успешно работает\.

Исправленный вариант кода:

```cpp
int **ArrayOfPointers = (int **)malloc(n * sizeof(int *));
```

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

```cpp
unsigned *p = (unsigned *)malloc(len * sizeof(size_t));
```

Программа, содержащая подобный код, скорее всего, будет корректно работать как в 32\-битном, так и в 64\-битном варианте\. Но в 64\-битном варианте программа выделяет больше памяти, чем ей необходимо\. Корректный вариант:

```cpp
unsigned *p = (unsigned *)malloc(len * sizeof(unsigned));
```

В ряде случаев, анализатор не выдает предупреждение, хотя типы X и Y не совпадают\. Пример подобного корректного кода:

```cpp
BYTE *simpleBuf = (BYTE *)malloc(n * sizeof(float));
```