警告:格式'%x'需要'unsigned int'类型的参数

时间:2016-01-10 13:02:44

标签: c printf format-specifiers

当我尝试编译时,我收到以下错误,不知道为什么......

  

警告:格式'%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);
}

2 个答案:

答案 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 *,因为对于指针类型,不会发生默认参数提升

话虽如此,

  1. main()至少应为int main(void),以符合标准。
  2. 您需要转发声明您的函数bo(),因为隐式声明现在错误和非标准。

答案 1 :(得分:7)

要打印地址,请使用"%p"代替"%x"。您还需要转换为void *

printf("Name buffer address:    %p\n", (void *) buffer);