C中空指针的指针算法

C中空指针的指针算法

当指向特定类型的指针(例如intcharfloat.)它的值会随着该数据类型的大小而增加。如果void指向大小数据的指针x是递增的,它是如何指向的?x前面的字节?编译器如何知道如何添加x值指针?



慕勒3428872
浏览 461回答 3
3回答

开心每一天1111

最后结论: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*.编者注:对这一答复进行了编辑,以反映最终结论。

慕桂英546537

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

MMMHUHU

这个C标准不允许空隙指针算法然而,GNU C的大小允许空隙是1.C11标准§6.2.5第19段这个void类型包含一组空值;它是不完全对象类型这是无法完成的。在GCC编译器中运行良好。#include<stdio.h>int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;arr[2]&nbsp;=&nbsp;{1,&nbsp;2}; &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*ptr&nbsp;=&nbsp;&arr; &nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;=&nbsp;ptr&nbsp;+&nbsp;sizeof(int); &nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;*(int&nbsp;*)ptr); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}可能是其他编译器生成错误。
打开App,查看更多内容
随时随地看视频慕课网APP