C 标准是否允许为指针分配任意值并递增它?

2023-12-31

这段代码的行为定义是否明确?

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    void *ptr = (char *)0x01;
    size_t val;

    ptr = (char *)ptr + 1;
    val = (size_t)(uintptr_t)ptr;

    printf("%zu\n", val);
    return 0;
}

我的意思是,我们可以为指针分配一些固定数字并递增它,即使它指向某个随机地址? (我知道你不能取消引用它)


分配:

void *ptr = (char *)0x01;

Is 实现定义的行为因为它正在将整数转换为指针。这在第 6.3.2.3 节中有详细介绍。C标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf关于指针:

5整数可以转换为任何指针类型。除非前面指定,否则结果是实现定义的, 可能未正确对齐,可能未指向实体 引用类型的,并且可能是陷阱表示。

至于后续的指针运算:

ptr = (char *)ptr + 1;

这取决于一些事情。

首先,当前值ptr may是按照上面 6.3.2.3 的陷阱表示。如果是,则行为是不明确的.

接下来的问题是是否0x1指向一个有效的对象。仅当指针操作数和结果都指向数组对象的元素(单个对象算作大小为 1 的数组)或数组对象后面的一个元素时,指针和整数相加才有效。第 6.5.6 节对此进行了详细说明:

7就这些运算符的目的而言,指向不是数组元素的对象的指针的行为与 指向长度为 one 且类型为的数组的第一个元素的指针 对象的元素类型

8当整数类型的表达式与指针相加或相减时,结果具有指针的类型 操作数。如果指针操作数指向数组的元素 对象,并且数组足够大,结果指向一个元素 与原始元素的偏移量,使得 结果数组元素和原始数组元素的下标等于 整数表达式。换句话说,如果表达式P指向 数组对象的第 i 个元素,表达式(P)+N(相当于,N+(P) ) and (P)-N (where N具有 n ) 指向的值, 分别是数组对象的第 i+n 个和第 i−n 个元素(前提是它们存在)。此外,如果表达式 P 指向 an 的最后一个元素 数组对象,表达式(P)+1点超过最后一个元素 数组对象,如果表达式Q点过去了 数组对象的最后一个元素,表达式(Q)-1指着 数组对象的最后一个元素。如果两个指针 操作数和结果指向同一个数组的元素 对象,或者数组对象的最后一个元素之后, 评估不应产生溢出;否则,行为是 不明确的。如果结果指向最后一个元素 数组对象,不得用作一元的操作数 * 被评估的运算符。

在托管实施上的价值0x1几乎肯定会not指向一个有效的对象,在这种情况下添加是不明确的。然而,嵌入式实现可以支持将指针设置为特定值,如果是这样,情况可能是这样的0x1事实上确实指向一个有效的对象。如果是这样,则行为是明确的,否则就是不明确的.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 标准是否允许为指针分配任意值并递增它? 的相关文章

随机推荐

  • 检查输入是否在两个值之间(多个条件)

    我正在制作一个项目 我需要读取不同格式的数字 并根据用户输入检查这些数字 在某些情况下 这将是一个像 8800 9000 这样的区间 在某些情况下 它将是一个 4 位数字 在某些情况下 它将是一个 5 位数字 该数组如下所示 var tes
  • ASP.NET MVC DropDownListFor 不从模型中选择值

    我正在使用 ASP NET MVC 3 并且刚刚使用DropDownListForHTML 帮助器 我在我的控制器中执行此操作 ViewBag ShippingTypes this SelectListDataRepository GetS
  • 子进程不创建 ffmpeg 命令的输出文件

    我正在尝试运行一个 ffmpeg 命令来记录我的屏幕并在 python 中创建一个 mp4 记录文件 当我在 shell 中运行该命令时 该命令有效 但当我使用子进程在 Python 脚本中运行该命令时 该命令不起作用 问题是 当使用子进程
  • 将字符编码映射到每个字符的最大字节数

    我正在寻找一个表 将给定的字符编码映射到每个字符的最大字节数 在可变长度编码的情况下 对于固定宽度编码 这很容易 尽管我不知道 在一些更深奥的编码的情况下 宽度是多少 对于 UTF 8 等 最好确定每个字符的最大字节数取决于在字符串中的最高
  • 仅基于表的一列消除重复值

    我的查询 SELECT sites siteName sites siteIP history date FROM sites INNER JOIN history ON sites siteName history siteName OR
  • 最小化代码,因为我使用相同的代码,仅 p 标签中的内容发生变化,组件 Accordion Header 标头发生变化

    我是js新手 我需要显示 6 个滑块 我单击时的每个 div 都应打开其相应的内容 当我再次单击 div 时 内容应该关闭 就像手风琴一样 正确知道它的工作原理 但如何最小化代码 因为我使用相同的代码 只有 p 标签中的内容发生变化 组件
  • CSS 不透明度属性?

    我真的需要所有这些 CSS 不透明度属性吗 我不会同时使用所有这些 而是 以不同的百分比显示它们 但我通常有 4 人一组 我想看看是否可以从样式表中删除任何内容 有人能给我举个 100 25 和 0 的例子吗 我想确保我正确地完成了它们 o
  • iOS5中如何获取默认的LandscapeLeft方向?

    抱歉 如果这个问题重复 但我找不到相同的解决方案 在 iOS6 中 如果我想为一个 UIViewController 设置默认方向 我只需使用 BOOL shouldAutorotate return YES NSUInteger supp
  • 带有 FileField 的 Django 模型——动态“upload_to”参数

    我使用带有 FileField 的模型来处理文件上传 现在文件就可以成功上传了 不过 我还想做一个小改进 那就是为用户创建用户名的文件夹 这是我尝试过的代码 class UserFiles models Model user models
  • 找不到“FacebookSDK/FacebookSDK.h”文件

    我已经安装了最新版本PhoneGap Facebook 插件 https github com phonegap phonegap facebook plugin但是当我构建项目时 我收到以下错误消息 我尝试了 stackoverflow
  • 谷歌地图片段在scrollView内

    所以我一直在尝试使用谷歌地图精简版fragment里面一个scrollView我无法显示地图 删除后scrollView然后将片段单独保留 现在您就可以看到地图了 我只是想了解为什么会这样 以及是否有任何方法可以让这个片段显示在我的滚动视图
  • NHibernate 缓存问题 - 何时调用 Evict?

    我遇到了一个明显的缓存问题 NHibernate 返回的内容与数据库中的内容不匹配 我相信这是二级缓存数据 看起来我可以使用 Evict 来做到这一点 但是什么时候应该实际调用 Evict 方法 对于我的特定应用程序 数据对于用户来说是唯一
  • Azure Signalr 服务中的单位是什么?

    So I ve been going through Azure Signal R Service for blazor apps and I ve noticed they have their pricing according to
  • Android Button 下无法去除阴影

    I have a Android Button that I m placing on my screen and am defining a custom background drawable that just specifies a
  • 缓冲随机访问文件 java

    RandomAccessFile 对于随机访问文件来说相当慢 您经常阅读有关在其上实现缓冲层的信息 但无法在网上找到执行此操作的代码 所以我的问题是 知道这个类的任何开源实现的你们会共享一个指针还是共享您自己的实现 如果这个问题能成为关于这
  • 提高比较算法 np.packbits(A==A[:, None], axis=1) 的性能

    我正在寻找内存优化np packbits A A None axis 1 where A是长度整数的密集数组n A A None 内存是否需要大容量n因为生成的布尔数组存储效率低下 每个布尔值占用 1 个字节 我编写了下面的脚本来实现相同的
  • 扩展Qt标准图标

    如何扩展 QStyle 类提供的标准图标并支持 Windows 和 Linux namespace Ui class TVLoader class TVLoader public QMainWindow Q OBJECT public ex
  • 查询 MongoDb 中的嵌套数组

    我想通过嵌套数组中存在的字符串来检索文档 例如 数据 表示句子的依存解析 如下所示 tuples xcomp multiply using det method the nn method foil dobj using method 我发
  • CPU预测和内存屏障

    我正在学习记忆障碍所以我提到记忆障碍 https www kernel org doc Documentation memory barriers txtLinux 内核源代码中的文档 还有一个描述我无法理解 控制依赖关系可能有点棘手 因为
  • C 标准是否允许为指针分配任意值并递增它?

    这段代码的行为定义是否明确 include