【问题标题】:warning: format ‘%x’ expects argument of type ‘unsigned int’警告:格式“%x”需要“unsigned int”类型的参数
【发布时间】:2016-04-14 19:49:36
【问题描述】:

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

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

【问题讨论】:

标签: c printf format-specifiers


【解决方案1】:

由于以下陈述,您会收到警告

    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),无符号 十进制 (u) 或 dddd 样式的无符号十六进制表示法(x 或 X); [...]

提供无效参数调用undefined behavior

您应该使用%p 来打印地址

p 参数应该是一个指向void.[...]

并将参数转换为void *,因为对于指针类型,没有默认参数提升发生。

话虽如此,

  1. main() 至少应该是 int main(void),以符合标准。
  2. 您需要转发声明您的函数bo(),因为隐式声明现在不好且不标准。

【讨论】:

    【解决方案2】:

    要打印地址,请使用 "%p" 而不是 "%x"。你还需要投到void *

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

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 2015-02-27
      • 2014-08-20
      相关资源
      最近更新 更多