Поделиться через


C6384

Предупреждение C6384: деление параметра sizeof указателя на другое значение.

Данное предупреждение указывает, что вычисление размера может быть неверным.Иногда, чтобы вычислить количество элементов в массиве, размер массива делят на размер первого элемента. Однако, если массив фактически является указателем, результат, как правило, отличается от ожидаемого.

Если указатель является параметром функции и размер буфера не передается, то вычислить максимальный доступный размер буфера не представляется возможным.Если память для указателя выделяется локально, следует использовать размер данного выделения.

Пример

Данное предупреждение создается в следующем коде:

#include <windows.h>
#include <TCHAR.h>

#define SIZE 15

void f( )
{
  LPTSTR dest = new TCHAR[SIZE];
  char src [SIZE] = "Hello, World!!";
  if (dest)
  {
    _tcsncpy(dest, src, sizeof dest  / sizeof dest[0]); 
  }
}

Для устранения этого предупреждения передайте размер буфера, как указано в следующем коде:

#include <windows.h>
#include <TCHAR.h>

#define SIZE 15

void f( )
{
  LPTSTR dest = new TCHAR[SIZE];
  char src [SIZE] = "Hello, World!!";
  if (dest)
  {
    _tcsncpy(dest, src, SIZE);
  }
}

Для устранения этого предупреждения с помощью безопасной строковой функции _tcsncpy_s используйте следующий код:

void f( )
{
  LPTSTR dest = new TCHAR[SIZE];
  char src [SIZE] = "Hello, World!!";
  if (dest)
  {
   _tcsncpy_s(dest, SIZE, src, SIZE);
  }
} 

Следует заметить, что использование new и delete имеет много опасностей в терминах утечки памяти и исключений.Чтобы избежать все такие проблемы утечек и исключений, используйте механизмы, предоставляемые библиотекой стандартных шаблонов (STL) C++.Они включают shared_ptr, unique_ptr и vector.Дополнительные сведения см. в разделах Интеллектуальные указатели (современный C++) и Справочник по стандартной библиотеке C++.

См. также

Ссылки

_mbsnbcpy_s, _mbsnbcpy_s_l

Оператор sizeof