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


C6066

Обновлен: Ноябрь 2007

C6066

Предупреждение C6066. В качестве параметра <номер> передан не указатель; при вызове <функция> требуется указатель

Данное предупреждение означает, что строка формата указывает на необходимость указателя, например спецификации %n или %p для функции printf или спецификации %d для функции scanf, однако передан аргумент, отличный от указателя. Данная ошибка, скорее всего, приведет к сбою или к какому-либо повреждению.

Пример

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

#include <stdio.h>
#define MAX 30
void f( )
{
  char buff[MAX];
  sprintf( buff, "%s %p %d", "Hello, World!", 1, MAX ); //warning C6066
  // code ...
}

void g( int i )
{
   int   result;
   result = scanf( "%d", i ); // warning C6066
   // code ...
}

Для устранения этого предупреждения в следующем коде функциям scanf и sprintf передаются правильные параметры:

#include <stdio.h>
#define MAX 30

void f( )
{
   char buff[MAX];

   sprintf( buff, "%s %p %d", "Hello, World!", buff, MAX ); // pass buff
   // code ... 
}
void g( int i )
{
   int   result;
   // code ...
   result = scanf( "%d", &i ); // pass the address of i
   // code ...
}

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

void f( )
{
   char buff[MAX];
  
   sprintf_s( buff, sizeof(buff), "%s %p %d", "Hello, World!", buff, MAX ); 
   // code ... 
}
void g( int i )
{
   int result;
   // code ...
   result = scanf_s( "%d", &i ); 
   // code ...
}

Данное предупреждение обычно выводится в ситуации, когда вместо указателя для формата %p используется целое число. Использование целого числа в подобных случаях приводит к невозможности запуска кода на 64-разрядных компьютерах.

См. также

Ссылки

sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l