为了账号安全,请及时绑定邮箱和手机立即绑定

C中空指针的指针算法

C中空指针的指针算法

C
慕勒3428872 2019-06-19 16:00:17
C中空指针的指针算法当指向特定类型的指针(例如int, char, float.)它的值会随着该数据类型的大小而增加。如果void指向大小数据的指针x是递增的,它是如何指向的?x前面的字节?编译器如何知道如何添加x值指针?
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

最后结论:a上的算术void*非法在C和C+中。

GCC允许将其作为扩展,请参见算术上void-和函数-指针(请注意,本节是手册“C扩展”一章的一部分)。clang和ICC可能允许void*为了与GCC兼容的目的。其他编译器(如MSVC)不允许对void*GCC不允许-pedantic-errors标志,或者如果-Werror-pointer-arith指定此标志(如果您的代码库也必须使用MSVC编译,则此标志非常有用)。

C标准说话

引用摘自n 1256草稿。

标准对加法操作的描述如下:

6.5.6-2:另外,两个操作数都应具有算术类型,或者一个操作数应为指向对象类型的指针,另一个操作数应为整数类型。

所以,这里的问题是void*是指向“对象类型”的指针,或等效的指针,无论是void是“对象类型”。“对象类型”的定义是:

6.2.5.1:类型被划分为对象类型(完全描述对象的类型),功能类型(描述函数的类型),以及不完全类型(描述对象的类型,但缺少确定对象大小所需的信息)。

标准定义了void作为:

6.2.5-19:void类型包含一组空值;它是一个不能完成的不完整类型。

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

因此,不能对void指针。

注记

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

6.2.5-27:无效指针应具有相同的表示和对齐要求作为指向字符类型的指针。

然而,

相同的表示和对齐需求意味着作为函数的参数、函数返回值和联合成员的互换性。

所以这意味着printf("%s", x)有着相同的含义x有型char*void*,但这并不意味着您可以在void*.

编者注:对这一答复进行了编辑,以反映最终结论。


查看完整回答
反对 回复 2019-06-19
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

指针算法不允许在void*指南针。


查看完整回答
反对 回复 2019-06-19
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这个C标准不允许空隙指针算法然而,GNU C的大小允许空隙1.

C11标准§6.2.5

第19段

这个void类型包含一组空值;它是不完全对象类型这是无法完成的。

在GCC编译器中运行良好。

#include<stdio.h>int main(){
    int arr[2] = {1, 2};
    void *ptr = &arr;
    ptr = ptr + sizeof(int);
    printf("%d\n", *(int *)ptr);
    return 0;}

可能是其他编译器生成错误。


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 460 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信