问题标签 [pointer-arithmetic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C ++在文件中查找所有指针算法
有几个大型 C++ 源文件。我们需要在这些文件中找到所有的指针算术运算。是否可以自动执行此任务?
是否可以在某些编译器中禁用指针运算并获取错误列表?
c - C中用于获取字符串的指针算法
我想获取字符数组的元素,但根本没有成功,问题是我只得到第一个和最后一个元素,仅此而已,我的代码是:
有什么帮助吗?谢谢
xcode - 取消引用 Xcode 上的 void* 警告
我知道这个 SO question和这个 SO question。这篇文章的新颖之处在于它对 Xcode 的关注,以及它使用方括号来取消引用指向 void 的指针。
以下程序在 Xcode 4.5.2 中编译时没有警告,在 GCC 4.2 上编译时出现警告,即使我现在没有 Visual Studio,我记得它会认为这是编译器错误,MSDN 和 Internet 都同意.
如果我将 main 正文的第三行更改为:
它在 GCC 和 Xcode 上编译时都没有警告。
我想知道如何在 GDB尤其是Xcode/LLVM 上将这种沉默转变为警告或错误,包括函数 main 是 int 但没有显式返回任何值的事实(顺便说一下,我认为 -Wall 可以解决问题在 GDB 上)。
c++ - 指针算术变相 &(array[0])
今天我浏览了一些源代码(这是一个解释软件框架使用的示例文件),发现了很多这样的代码:
所以基本上,他们已经完成了“获取位于地址的对象的地址array + x
”。
通常我会说,这完全是愚蠢的,因为写作array + 0
或array + 9
直接做同样的事情。我什至总是将这样的代码重写为 size_t for 循环,但这是风格问题。
但是过度使用它让我开始思考:我是否遗漏了一些明显的东西或隐藏在语言黑暗角落的东西?
对于任何想要查看原始源代码的人,所有它都是令人讨厌goto
的 s ,malloc
当然还有这个指针的东西,请随时在线查看。
c - 指针运算中的访问冲突
使用代码:
为什么我会收到访问冲突?我应该改变什么?
c++ - 非数组类型的“one-past-the-end”指针是 C++ 中的有效概念吗?
C++ 标准 [sec 5.7] 说:
如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则计算不应产生溢出;否则,行为未定义。
那么,我是否正确假设未定义其他类型的指针,而不是数组?
例如:
上面的代码片段编译并且工作得很好(使用 g++),但它有效吗?
c - 指针地址算术和十六进制/十进制转换
我有一个从 和 获得的extern char etext
指针end
地址edata
。我还使用&<Variable Name>
. 两者都是十六进制指针地址。
我需要对这些十进制地址进行算术运算。我该怎么做?我需要将地址转换为十进制整数,这样我就可以通过减去地址来找到内存段的大小。
c++ - 算术中涉及指针函数的错误
这是我的错误:
我想知道前 4 个错误是为了什么。我需要修复所有错误,但我主要关心前 4 个。
这是程序:
这只是试图采用后缀函数并对其进行评估。
c - C 指针算术和数组访问
我有一个函数,它需要一个指向结构数组的指针
我访问数组的方式似乎有点偏离。
有一个更好的方法吗?
c++ - 跨子对象边界的指针算法
以下代码(跨子对象边界执行指针算术)是否T
对其编译的类型(在 C++11中不一定必须是 POD)或其任何子集具有明确定义的行为?
LLVM 在内部向量类型的实现中使用了上述技术的变体,该向量类型经过优化,最初将堆栈用于小型数组,但一旦超过初始容量,就会切换到堆分配的缓冲区。(从这个例子中并不清楚这样做的原因,但显然是为了减少模板代码膨胀;如果你看一下代码,这会更清楚。)
注意:在任何人抱怨之前,这并不是他们正在做的事情,可能他们的方法比我在这里给出的更符合标准,但我想问一下一般情况。
显然,它在实践中有效,但我很好奇标准中的任何内容是否可以保证这种情况。鉴于N3242/expr.add,我倾向于说不:
当两个指向同一个数组对象的元素的指针相减时,结果是两个数组元素的下标之差……此外,如果表达式 P 指向数组对象的一个元素,或者指向最后一个元素之后的一个元素一个数组对象,并且表达式 Q 指向同一个数组对象的最后一个元素,表达式 ((Q)+1)-(P) 与 ((Q)-(P))+1 具有相同的值并且为 -((P)-((Q)+1)),如果表达式 P 指向数组对象的最后一个元素后一个,则值为零,即使表达式 (Q)+1 不指向数组对象的元素。...除非两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为是未定义的。
但理论上,上述引用的中间部分,结合类布局和对齐保证,可能允许以下(次要)调整有效:
结合有关union
布局、与 的可转换性等的各种其他规定char *
,可以说原始代码也有效。(主要问题是上面给出的指针算术定义缺乏传递性。)
有谁肯定知道吗?N3242/expr.add似乎明确指出,指针必须属于同一个“数组对象”才能对其进行定义,但假设标准中的其他保证在组合在一起时可能需要定义这种情况是为了保持逻辑上的自洽。(我不赌它,但我认为它至少是可以想象的。)
编辑:@MatthieuM 提出了这个类不是标准布局的反对意见,因此可能不能保证在基本子对象和派生的第一个成员之间不包含任何填充,即使两者都对齐到alignof(T)
. 我不确定这是多么真实,但这会引发以下变体问题:
如果继承被删除,这能保证工作吗?
&d.end - &d.begin >= sizeof(float) * 10
即使&d.end - &d.begin == sizeof(float) * 10
没有也能保证?
最后编辑@ArneMertz 主张对N3242/expr.add进行非常仔细的阅读(是的,我知道我正在阅读草稿,但它已经足够接近了),但标准是否真的暗示以下内容具有未定义的行为,那么如果交换行被删除?(与上述相同的类定义)
另外,如果==
不够强,如果我们利用std::less
指针上的全序这一事实,并将上面的条件更改为:
根据严格阅读标准,假设两个相等指针指向同一个数组对象的代码是否真的被破坏了?
编辑抱歉,只想再添加一个示例,以消除标准布局问题: