【发布时间】:2018-09-07 06:18:07
【问题描述】:
此时我正试图在我的代码中打印出argv 的值,但是当我尝试编译它时,我得到了
warning: format ‘%p’ expects argument of type ‘void *’, but argument 3 has type ‘char **。我不确定这个警告是什么意思。 %p 即使是指针也不能用于argv 吗?
int main(int argc, char* argv[])
{
printf("%s%p", "argv = ", argv);
}
【问题讨论】:
-
那么投吧——
printf("argv = %p\n", (void *)argv);? -
看起来 printf 需要一个“void *”类型的参数,但你给它的类型是“char **”。您希望编译器消息更明确多少?
-
@Jonathan 只是在没有解释或不知道机器内部发生了什么的情况下进行类型转换,很快就会导致未定义的行为。最好知道为什么编译器在这种情况下需要显式类型转换。
-
将其转换为 (void*) 将修复警告,但输出可能不是您真正想要的。
%p打印内存地址的文本表示,而不是地址处的数据。此外,它并不是专门用于 argv,而是用于任何指针。 -
@RolandIllig:你想解释一下吗?转换为
void *并返回必须是幂等的,所以我不确定您在转换为void *时会看到什么风险,特别是因为标准明确要求为%p传递的值必须是void *(否其他指针类型可接受)。