C 警告:格式‘;%p’;应为类型为‘;无效*’;,但参数3的类型为‘;字符**’;

C 警告:格式‘;%p’;应为类型为‘;无效*’;,但参数3的类型为‘;字符**’;,c,pointers,C,Pointers,我试图在代码的这一点上打印出argv的值,但是当我试图编译它时,我得到了 警告:格式“%p”要求参数类型为“void*”,但参数3的类型为“char**。我不知道这个警告是什么意思。%p即使是指针,也不能用于argv int main(int argc, char* argv[]) { printf("%s%p", "argv = ", argv); } 嗯,不是任何指针(类型) 根据C11,第§7.21.6.1章,对于%p转换说明符 p 该参数应为指向void的指针。指针的值为 在定

我试图在代码的这一点上打印出
argv
的值,但是当我试图编译它时,我得到了
警告:格式“%p”要求参数类型为“void*”,但参数3的类型为“char**
。我不知道这个警告是什么意思。
%p
即使是指针,也不能用于
argv

int main(int argc, char* argv[])
{
    printf("%s%p", "argv = ", argv);
}
嗯,不是任何指针(类型)

根据
C11
,第§7.21.6.1章,对于
%p
转换说明符

p

该参数应为指向
void
的指针。指针的值为 在定义的实现中转换为打印字符序列 态度

因此,参数的类型必须是
void*
(或者是
char*
,因为它们具有相同的对齐要求)。任何其他类型的指针都必须通过显式转换进行转换,因为指针没有默认的参数提升

差不多

printf("%s%p", "argv = ", (void *)argv);
应该可以。

嗯,不是任何指针(类型)

根据
C11
,第§7.21.6.1章,对于
%p
转换说明符

p

该参数应为指向
void
的指针。指针的值为 在定义的实现中转换为打印字符序列 态度

因此,参数的类型必须是
void*
(或者是
char*
,因为它们具有相同的对齐要求)。任何其他类型的指针都必须通过显式转换进行转换,因为指针没有默认的参数提升

差不多

printf("%s%p", "argv = ", (void *)argv);

应该这样做。

为了打印
argv
以及您需要执行的地址

int main(int argc, char* argv[])
{
    int i;
    printf("address of argv = %p\n", (void *)argv);
    for (i = 0; i < argc; ++i)
    {
        printf("%s\n", argv[i]);
    }
    return 0;
}
intmain(intargc,char*argv[])
{
int i;
printf(“argv的地址=%p\n”,(void*)argv);
对于(i=0;i
为了打印
argv
以及您需要执行的地址

int main(int argc, char* argv[])
{
    int i;
    printf("address of argv = %p\n", (void *)argv);
    for (i = 0; i < argc; ++i)
    {
        printf("%s\n", argv[i]);
    }
    return 0;
}
intmain(intargc,char*argv[])
{
int i;
printf(“argv的地址=%p\n”,(void*)argv);
对于(i=0;i
那你为什么不投它呢

printf("argv = %p\n", (void *)argv);`
指定了
%p
指针(POSIX;C11):

p
-参数应是指向
void
的指针。指针的值以实现定义的方式转换为一系列打印字符

由于
char**
不是
void*
,因此需要进行显式转换。标准不允许编译器为您执行到
void*
的转换-声明
printf()
中的省略号表示出现默认参数提升,但这仅影响
float
类型和小于
int
的整数类型(
short
char
等)

现在,在大多数机器上,这是不可行的。在我学习用C编程的(早已过时的)机器上,还没有
void*
(对于标准来说太旧了),但等效的是
char*
,给定内存位置的
char*
地址值与任何其他类型的指针值不同-强制转换不是可选的


请注意,我假设您打算打印地址的值。如果您打算打印内容,那么还有更多的工作要做。

那么为什么不转换它呢

printf("argv = %p\n", (void *)argv);`
指定了
%p
指针(POSIX;C11):

p
-参数应为指向
void
的指针。指针的值以实现定义的方式转换为打印字符序列

由于
char**
不是
void*
,您需要执行显式转换。标准不允许编译器为您执行到
void*
的转换-
printf()声明中的省略号符号
表示出现默认参数提升,但仅影响
浮点型和小于
int
的整数型(
short
char
等)

现在,在大多数机器上,这是不可行的。在我学习用C编程的(早已过时的)机器上,还没有
void*
(对于标准来说太旧了),但等效的是
char*
,给定内存位置的
char*
地址值与任何其他类型的指针值不同-强制转换不是可选的


请注意,我假设您打算打印地址的值。如果您打算打印内容,那么还有更多的工作要做。

所以将其转换为printf(“argv=%p\n”,(void*)argv)
?printf似乎需要一个'void*'类型的参数,但您给了它'char**类型。您希望编译器消息显式多少?@Jonathan在没有解释或不知道机器内部发生了什么的情况下简单地执行类型转换,可能会很快导致未定义的行为。最好知道为什么编译器会在这种情况下,iler需要显式类型转换。将其转换为(void*)将修复警告,但输出可能不是您真正想要的。
%p
打印内存地址的文本表示,而不是地址上的数据。此外,它不是专门用于argv的,而是用于任何指针。@RolandIllig:您想解释吗?到
void*
的转换和返回必须是be幂等元,所以我不确定转换为
void*
会有什么风险,特别是因为标准明确要求传递给
%p
的值必须是
void*