gpt4 book ai didi

c++ - printf 和指针

转载 作者:IT老高 更新时间:2023-10-28 21:42:03 29 4
gpt4 key购买 nike

Possible Duplicate:
Correct format specifier to print pointer (address)?

当使用printf 打印指针时,是否有必要 将指针强制转换为void *?换句话说,像

这样的代码
#include <stdio.h>
int main() {
int a;
printf("address of a = %p\n", &a);
}

参数真的应该是 (void *) &a 吗? gcc 在没有进行显式转换时似乎没有给出任何警告。

最佳答案

是的,需要强制转换为 void*

int a;
printf("address of a = %p\n", &a);

&aint* 类型; printf 的 "%p" 格式需要 void* 类型的参数。 int* 参数 not 隐式转换为 void*,因为 printf 的声明不提供类型第一个以外的参数信息(格式字符串)。格式字符串之后的所有参数都应用了 默认参数提升;这些促销不会将 int* 转换为 void*

可能的结果是 printf 看到一个真正属于 int* 类型的参数并将其解释为 它是 类型>无效*。这是类型双关语,而不是转换,并且具有未定义的行为。如果 int*void* 碰巧具有相同的表示形式,它可能会起作用,但语言标准并不能保证这一点,即使是暗示也是如此。我描述的类型双关语只是一种可能的行为。该标准几乎没有说明会发生什么。

(如果您对具有可见原型(prototype)的非可变参数函数执行相同的操作,那么编译器在调用时就知道参数的类型是 void*,那么它将生成代码以执行隐式 int*-to-void* 转换。这里不是这种情况。)

关于c++ - printf 和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056328/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com