当我尝试编译时,我收到以下错误,不知道为什么......
警告:格式'%x'需要'unsigned int'类型的参数,但参数2的类型为'char *'[-Wformat =]
printf("Name buffer address: %x\n", buffer);
代码:
#include <string.h>
#include <stdio.h>
main(){
char name[200];
printf("What is your name?\n");
scanf("%s", name);
bo(name, "uname -a");
}
int bo(char *name, char *cmd){
char c[40];
char buffer[40];
printf("Name buffer address: %x\n", buffer);
printf("Command buffer address: %x\n", c);
strcpy(c, cmd);
strcpy(buffer, name);
printf("Goodbye, %s!\n", buffer);
printf("Executing command: %s\n", c);
fflush(stdout);
system(c);
}
答案 0 :(得分:8)
由于以下陈述,您收到警告
printf("Name buffer address: %x\n", buffer);
printf("Command buffer address: %x\n", c);
%x
需要unsigned int
,而您提供指针。
参考C11
标准,章节§7.21.6.1
o,u,x,X
unsigned int参数转换为无符号八进制(o),无符号 样式dddd中的十进制(u)或无符号十六进制表示法(x或X); [...]
提供无效参数调用undefined behavior。
您应该使用%p
打印地址
p
参数应是指向void
的指针。[...]
并将参数强制转换为void *
,因为对于指针类型,不会发生默认参数提升。
话虽如此,
main()
至少应为int main(void)
,以符合标准。bo()
,因为隐式声明现在错误和非标准。答案 1 :(得分:7)
要打印地址,请使用"%p"
代替"%x"
。您还需要转换为void *
printf("Name buffer address: %p\n", (void *) buffer);