Condividi tramite


C6066

Aggiornamento: novembre 2007

C6066

avviso C6066: non puntatore passato come parametro <numero> mentre nella chiamata a <funzione> è richiesto un puntatore

L'avviso indica che nella stringa di formato è specificato che è richiesto un puntatore, ad esempio una specifica %n o %p per printf o %d per scanf, ma è stato passato un tipo non puntatore. Questo errore può causare una qualche forma di arresto anomalo o danneggiamento.

Esempio

Il codice seguente genera questo avviso:

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

Per risolvere il problema, nel codice seguente vengono passati i parametri corretti alle funzioni sprintf e 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 ...
}

Per risolvere il problema, nel codice seguente vengono utilizzate le funzioni protette di modifica delle stringhe, sprintf_s e 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 ...
}

Solitamente, l'avviso viene riportato in quanto per un formato %p è stato utilizzato un integer invece di un puntatore. Non è possibile trasferire l'utilizzo di questa istanza su computer a 64 bit.

Vedere anche

Riferimenti

sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l