微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用printf的%p格式说明符时,为什么需要在C中将参数转换为void *?

如何解决使用printf的%p格式说明符时,为什么需要在C中将参数转换为void *?

我正在尝试以下C代码

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int a = 5;
    int *ptr = &a;
    printf("Data stored: %d\n",*ptr); // Simply prints 5.
    printf("Address of variable a: %p\n",(void*) &a);
    printf("Data stored in ptr: %p\n",(void*) ptr);
    return EXIT_SUCCESS;
}

我用以下程序编译程序:

gcc -Wall -Wextra -Wconversion -pedantic -std=c11 -fsanitize=address -fsanitize=undefined example-1.c -o example-1 

我知道%p格式说明符期望一个对象地址(使用&或有效的指针),但是当我编译代码而不将类型转换为void*时,它会产生警告:

example-1.c: In function ‘main’:
example-1.c:8:37: warning: format ‘%p’ expects argument of type ‘void *’,but argument 2 has type ‘int *’ [-Wformat=]
     printf("Address of variable a: %p\n",&a);
                                    ~^     ~~
                                    %ls
example-1.c:9:34: warning: format ‘%p’ expects argument of type ‘void *’,but argument 2 has type ‘int *’ [-Wformat=]
     printf("Data stored in ptr: %p\n",ptr);
                                 ~^
                                 %ls

因此,我自然将类型转换为void*的参数,然后程序可以正常工作,但是我无法对实际发生的情况做出任何逻辑推断。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。