gpt4 book ai didi

打印时将指针转换到 void

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:15 24 4
gpt4 key购买 nike

我最近一直在尝试学习一些 C 基础知识,以尝试建立对低级语言的基本理解。在我遇到的一份文件中 ( A tutorial on pointers and arrays in C )作者在 printf 语句中使用了 void 指针:

int var = 2;
printf("var has the value %d and is stored at %p\n", var, (void *) &var);

并说明原因:

I cast the pointers to integers into void pointers to make them compatible with the %p conversion specification.

但是,省略 (void *) 不会导致错误或警告,无论是编译和运行还是通过 valgrind 运行。

int var = 2;
printf("var has the value %d and is stored at %p\n", var, &var);

在这里转换为 void 是否被认为是最佳实践或标准,还是有更危险的事情正在发生?

最佳答案

因为 printf 是一个可变参数函数,它的声明只指定了第一个参数的类型(格式字符串)。任何剩余参数的数量和类型都需要与格式字符串相匹配,但这取决于您,程序员,以确保它们确实匹配。如果他们不这样做,则行为未定义,但编译器没有义务警告您。 (一些编译器,包括 gcc,可以检查格式字符串是否是文字。)

%p 格式说明符需要一个类型为 void* 的参数。如果你传递一个不同类型的指针,你有未定义的行为。在许多实现中,所有指针类型都具有相同的大小和表示形式,并且以与函数参数相同的方式传递——但语言并不能保证这一点。通过将指针显式转换为 void*,您可以保证它能正常工作。通过省略强制转换,您的代码可能在几乎所有实现中都按您预期的方式工作。

100% 正确优于 99% 正确,特别是如果额外 1% 的唯一成本是输入几个字符。

关于打印时将指针转换到 void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36780919/

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