Sdílet prostřednictvím


C6384

upozornění C6384: vydělení sizeof ukazatele jinou hodnotou

Toto upozornění naznačuje, že výpočet velikosti může být nesprávný.Při výpočtu počtu prvků v poli je někdy velikost pole vydělena velikostí prvního prvku. Avšak, pokud je pole ukazatelem, výsledek se bude lišit od původního očekávání.

Pokud je ukazatel parametrem funkce a nebyla předána velikost vyrovnávací paměti, není možné vypočítat maximální dostupnou vyrovnávací paměť.Pokud je ukazatel přidělen lokálně, měla by být použita velikost, která byla použita při přidělování.

Příklad

Následující kód generuje toto upozornění:

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

Chcete-li opravit toto upozornění, předejte velikost vyrovnávací paměti, jak je znázorněno v následujícím kódu:

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

Pro nápravu tohoto upozornění použitím bezpečné funkce _tcsncpy_s pro práci s řetězci použijte následující kód:

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

Všimněte si, že použití new a delete mnoho nástrah v podobě nevracení paměti a výjimek.Chcete-li zabránit těmto druhům problémů úniky a výjimkami zcela, použijte mechanismy, které jsou k dispozici v knihovně C++ STL.Patří mezi ně shared_ptr, unique_ptr a vector.Další informace naleznete v tématu Chytré ukazatele (moderní verze jazyka C++) a Standardní knihovna C++ – referenční dokumentace.

Viz také

Referenční dokumentace

_mbsnbcpy_s, _mbsnbcpy_s_l

sizeof – operátor