C++ 从数组定义行为中间的指针进行负索引?

2023-11-23

#include <iostream>
using namespace std;

const int BUFSIZE = 1 << 20;
char padded_buffer[64 + BUFSIZE + 64];
char* buffer = padded_buffer + 64;

int main()
{
    buffer[-1] = '?';
    // is that always equivalent to padded_buffer[63] = '?' ?
    cout << padded_buffer[63] << "\n";
    return 0;
}

我有一段像上面这样的代码。基本上,由于某些原因,我需要“隔离”阵列的两侧。

但我想知道上面的语法是否安全?我知道负索引通常是未定义的行为,但是这种情况又如何呢?


From https://eel.is/c++draft/expr.sub#2:

表达方式E1[E2]与(根据定义)相同*((E1)+(E2)),但在数组操作数的情况下,如果该操作数是左值,则结果是左值,否则结果是x值。

只要您仅到达指向同一数组中元素的指针,就可以定义指针算术。

不存在未定义的行为。buffer[-1]只是*(padded_buffer + 64 -1).


这在某种程度上是基于意见的,但是buffer[-1]看起来很奇怪。恕我直言,它混淆了这样一个事实:buffer不是数组,而是指向实际数组中间元素的指针。如果你想给数组的第 63 个元素赋值padded_buffer然后就这样做:padded_buffer[63] = '?';.

在评论中,我建议将数组包装在具有重载的自定义类型中operator[],但这并不能解决看起来怪异的问题x[-1]。也许我宁愿让索引转换在调用代码中直接可见,以便padded_array[ transform_index(-1) ].

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

C++ 从数组定义行为中间的指针进行负索引? 的相关文章

随机推荐

  • JPA 和 Hibernate 中的无符号整数

    我该怎么做才能让 JPA 我使用 Hibernate 创建具有无符号类型的列 目前我的所有 ID 列均已签名 使用columnDefinition财产在 Column注解应该这样做 采取total猜测您要使用的 SQL 类型 private
  • 错误:安装 json 时出错:错误:无法构建 gem 本机扩展

    我正在尝试安装 gem json 并收到 json 错误 我在跑 Windows 8 1 64 位 红宝石 红宝石 1 9 3p545 2014 02 24 i386 mingw32 宝石 1 8 2 D GIT calabash gt g
  • 在 Nodejs 中读取原始 http 消息

    我正在使用 http request 函数发送 http 请求 并且我想读取整个 http 响应 如文本 即原始的 http 协议文本 是否可以 我写了下面的代码 但它不起作用 Set up the request console log
  • 在java中处理四精度浮点数(128位)

    我需要利用来自另一个系统的数字 这些数字是java中的128位 四精度 浮点数 考虑到java中没有等效的类型 我想使用java代码降低数字的精度 以便它们可以存储在java double中 这可以在 c 或使用汇编中相当容易地完成 但我想
  • 我可以将已保存的 R 对象加载到新的对象名称中吗?

    当您使用 R 数据文件保存变量时save 它以保存它的会话中的任何名称保存 当我稍后从另一个会话加载它时 它会以相同的名称加载 加载脚本不可能知道该名称 该名称可能会覆盖加载会话中同名的现有变量 有没有一种方法可以安全地将对象从数据文件加载
  • 从 web.config 读取会员资格部分

    我已经创建了一个自定义成员资格提供程序类 到目前为止一切顺利 但是 我不确定如何从 web config 文件中读取配置设置 我尝试从 Google 和 Stackoverflow 进行搜索 似乎有人也遇到了我的问题 问题并询问 但没有给出
  • Jackson 循环依赖项

    我有一个循环依赖 我现在正在努力解决它 学习这两个课程 出于演示目的删除了样板代码 Class 1 Entity Table name T CREDENTIAL Cache usage CacheConcurrencyStrategy RE
  • strtok 不丢弃换行符

    所以我有一个包含一堆名称和数字的输入文件 我开始使用 strtok 来分解字符串 以便我可以从每个字符串中提取所有数据 一切似乎都工作正常 但由于某种原因 它没有丢弃换行符 int procFile PERSON data FILE fpF
  • onUserInteraction() 到底什么时候被调用?

    在我的应用程序中 我有一个线程每隔 60 秒检查一次来自 Web 服务的数据 在 onCreate 中定义 new Thread new Runnable Override public void run while true try Th
  • TextureView 中的抗锯齿

    我尝试用SurfaceView and a TextureView并注意到用TextureView比使用更多别名 更少 平滑 SurfaceView 这是什么原因呢 有什么办法可以配置渲染TextureView为了看起来更好 The Tex
  • 用于调用 printf 的 C++11 编译时格式字符串文字构造

    我想做的是创建 template
  • javax.mail.AuthenticationFailedException:535 5.0.0 身份验证失败

    我不明白为什么我会得到这个例外 这是尝试发送电子邮件的代码 public void sendAsHotmail final String username jTextField14 getText final String password
  • Kafka Consumer 挂在 java 中的 .hasNext 处

    我有一个简单的 Java Kafka Consumer 代码如下 public void run ConsumerIterator
  • 在 ajax 加载的内容上重新运行应用程序 Javascript

    我希望我的应用程序中的所有 AJAX 加载内容都由我的应用程序 JQuery 脚本进行评估 与正常加载的内容相同 例如JQuery 扫描 AJAX 加载的内容以查找选择器 例如 模式框链接 等 我所有的 JavaScript 都在普通的 d
  • HTML5 / JS 存储事件处理程序

    我正在使用 Safari webkit 的引擎以及 HTML5 和 JS 来创建一个离线应用程序 现在我正在使用sessionStorage数组来存储我的应用程序的状态 模拟 存储数据与检查器一起工作正常 功能工作正常 只是事件处理程序没有
  • 调用 WebMethod,传递 Dictionary 作为参数

    我正在尝试简化将数据从 WebMethod 层返回到客户端的过程 并将来自客户端的参数集表示为Dictionary
  • 从 python 的单词列表中返回一个随机单词

    我想使用 python 从文件中检索随机单词 但我不相信我的以下方法是最好或有效的 请协助 import fileinput import random file line for line in fileinput input etc d
  • PHP 通过 VPN 发布数据

    我需要连接到一个网络服务behind of a VPN通过 PHP 我的服务器是 Debian Linux Squeeze 是否可以在 Linux 上通过 PHP 来完成此任务 如果可以的话这样做会有风险吗 当VPN连接挂起等时 操作系统或
  • C# 中 JSON 字符串到 CSV 以及 CSV 到 JSON 的转换

    我正在我的 asp net Web API 项目中使用 JSON CSV 文件并尝试使用CSV助手 and ServiceStack Text库但无法使其工作 包含数组的 JSON 文件是动态的 并且可以具有任意数量的字段 我使用 Stre
  • C++ 从数组定义行为中间的指针进行负索引?

    include