gpt4 book ai didi

c - C中void指针的指针算法

转载 作者:太空狗 更新时间:2023-10-29 16:14:13 29 4
gpt4 key购买 nike

当指向特定类型(比如 intcharfloat、..)的指针递增时,它的值会增加该数据类型的大小。如果指向大小为 x 的数据的 void 指针递增,它如何指向前面的 x 字节?编译器如何知道将 x 添加到指针的值?

最佳答案

最终结论:void* 的算术运算在 C 和 C++ 中都是非法

GCC 允许它作为扩展,参见 Arithmetic on void- and Function-Pointers (请注意,本节是手册“C 扩展”一章的一部分)。为了与 GCC 兼容,Clang 和 ICC 可能允许使用 void* 算法。其他编译器(例如 MSVC)不允许对 void* 进行算术运算,如果指定了 -pedantic-errors 标志,或者如果 -Werror-指定了 pointer-arith 标志(如果您的代码库还必须使用 MSVC 进行编译,则此标志很有用)。

C 标准说话

引用自 n1256 草案。

标准对加法运算状态的描述:

6.5.6-2: For addition, either bothoperands shall have arithmetic type,or one operand shall be a pointer toan object type and the other shallhave integer type.

所以,这里的问题是void*是否是指向“对象类型”的指针,或者等价地,void是否是“对象类型”。 “对象类型”的定义是:

6.2.5.1: Types are partitioned into object types (types that fully describe objects) , function types (types that describe functions), and incomplete types (types that describe objects but lack information needed to determine their sizes).

标准将 void 定义为:

6.2.5-19: The void type comprisesan empty set of values;it is an incomplete type that cannotbe completed.

因为 void 是一个不完整的类型,所以它不是一个对象类型。因此它不是加法运算的有效操作数。

因此您不能对 void 指针执行指针运算。

注意事项

最初,由于 C 标准的这些部分,认为 void* 算术是允许的:

6.2.5-27: A pointer to void shall have the same representation and alignmentrequirements as a pointer to acharacter type.

但是,

The same representation and alignmentrequirements are meant to implyinterchangeability as arguments tofunctions, return values fromfunctions, and members of unions.

所以这意味着 printf("%s", x) 具有相同的含义,无论 x 的类型是 char* 还是 void*,但这并不意味着您可以对 void* 进行算术运算。

关于c - C中void指针的指针算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3523145/

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