C6066
warning C6066: non-pointer passed as parameter <number> when pointer is required in call to <function>
This warning indicates that the format string specifies that a pointer is required, for example, a %n
or %p
specification for printf or a %d
for scanf
, but a non-pointer is being passed. This defect is likely to cause a crash or corruption of some form.
Example
The following code generates this warning:
#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 ...
}
To correct this warning, the following code passes correct parameters to the sprintf
and scanf
functions:
#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 ...
}
The following code use safe string manipulation functions — sprintf_s
and scanf_s
— to correct this warning:
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 ...
}
This warning is typically reported because an integer has been used for a %p
format instead of a pointer. Using an integer in this instance is not portable to 64-bit computers.
See Also
Reference
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l