Compartilhar via


C6384

aviso C6384: Dividindo o sizeof de um ponteiro por outro valor

Este aviso indica que um cálculo de tamanho pode estar incorreto.Para calcular o número de elementos em uma matriz, às vezes, alguém divide o tamanho da matriz pelo tamanho do primeiro elemento. No entanto, quando a matriz é realmente um ponteiro, o resultado geralmente é diferente do pretendido.

Se o ponteiro for um parâmetro de função e o tamanho do buffer não tiver sido passado, não é possível calcular o buffer máximo disponível.Quando o ponteiro é alocado localmente, o tamanho usado na alocação deve ser usado.

Exemplo

O código a seguir gera este aviso:

#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]); 
  }
}

Para corrigir este aviso, informe o tamanho do buffer, como mostrado no código o seguir:

#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);
  }
}

Para corrigir este aviso usando a função _tcsncpy_s de cadeia de caracteres segura, use o código a seguir:

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

Observe que o uso de new e delete tem muitas armadilhas em termos de vazamentos de memória e exceções.Para evitar esses tipos de vazamentos e problemas de exceção no geral, use os mecanismos que são fornecidos pela STL (Biblioteca de Modelos Padrão) do C++.Incluem shared_ptr, unique_ptr e vector.Para obter mais informações, consulte Ponteiros inteligentes (C++ moderno) e Referência da Biblioteca Padrão C++.

Consulte também

Referência

_mbsnbcpy_s, _mbsnbcpy_s_l

Operador sizeof