C6066
Aviso C6066: não ponteiro passado como parâmetro <número> quando o ponteiro é necessário na chamada para <função>
Esse aviso indicar que a cadeia de caracteres de formato que especifica um ponteiro será necessário, uma especificação por exemplo, de %n ou de %p para o printf ou um %d para scanf, mas não um ponteiro está sendo passado.Este defeito provavelmente causar uma falha ou um dano de alguma forma.
Exemplo
O código a seguir gera este aviso:
#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 ...
}
Para corrigir esse aviso, o código a seguir transmite parâmetros corretos para funções de sprintf e de 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 ...
}
A manipulação de cadeia de caracteres segura do seguinte uso de código funciona sprintf_s — e — scanf_s para corrigir esse aviso:
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 ...
}
Esse aviso é relatado normalmente porque um inteiro era usado para um formato de %p em vez de um ponteiro.Usar um inteiro não nesse caso é portátil aos computadores de 64 bits.