如何解决使用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 举报,一经查实,本站将立刻删除。