C6067
uyarı C6067: parametre <number> <function> çağrısı, adres dizesi olmalıdır
Bu uyarı, biçim belirticisi ve işlev parametresi arasında bir uyumsuzluk olduğunu gösterir.Uyarı dizenin adresini kullanarak önerse bile; bir işlevin, sorunu düzeltmeden önce beklediği parametrenin türünü denetlemeniz gerekir.Örneğin, bir %s belirtimi printf için dize değişkenini gerektirir, ancak scanf içindeki bir %s belirtimi, bir dizenin adresini gerektirir.
Bu hata çökmesine veya bazı formların bozulmasına neden olabilir.
Örnek
Aşağıdaki kod; bir tamsayı, dize yerine geçtiğinde bu uyarıyı oluşturur:
#include <stdio.h>
void f_defective( )
{
char *str = "Hello, World!";
printf("String:\n %s",1); // warning
// code ...
}
Uyarıyı düzeltmek için bir dizeyi, aşağıdaki kodda gösterildiği gibi printf için bir parametre olarak geçirin:
#include <stdio.h>
void f_corrected( )
{
char *str = "Hello, World!";
printf("String:\n %s",str);
// code ...
}
Aşağıdaki kod bu uyarıyı oluşturur; çünkü scanf için parametre geçirilirken iletmenin yanlış bir düzeyi arabelleği belirtir:
#include <stdio.h>
void h_defective( )
{
int retval;
char* buffer = new char(20);
if ( buffer )
{
retval = scanf("%s", &buffer); // warning C6067
// code...
delete buffer ;
}
}
Uyarılar düzeltmek için aşağıdaki kodda gösterildiği gibi doğru parametre iletin:
#include <stdio.h>
void h_corrected( )
{
int retval;
char* buffer = new char(20);
if ( buffer )
{
retval = scanf("%s", buffer);
// code...
delete buffer;
}
}
Aşağıdaki kod, bu uyarıyı düzeltmek için güvenli dize işleme işlevleri kullanır:
#include <stdio.h>
void f_safe( )
{
char buff[20];
int retVal;
sprintf_s( buff, 20, "%s %s", "Hello", "World!" );
printf_s( "String:\n %s %s", "Hello", "World!" );
retVal = scanf_s("%s", buff, 20);
}
Ayrıca bkz.
Başvuru
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l