次の方法で共有


C6066

警告 C6066: non-pointer がパラメーター <数値> として渡されました。<関数> への呼び出しにはポインターが必要です。

この警告は、たとえば 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