C6066

警告 C6066:传递了非指针参数 <number>,而对 <function> 的调用需要指针参数

此警告意味着,格式字符串指定需要指针,例如,为 printf 指定 %n 或 %p,或者为 scanf 指定 %d,但所传递的是非指针。 此缺陷有可能会导致某种形式的系统崩溃或损坏。

示例

下面的代码生成此警告:

#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 ...
}

为了更正此警告,下面的代码将正确的参数传递给 sprintf 和 scanf 函数:

#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