C++ - 指针上的运算符 -= [重复]

问题描述 投票:0回答:2

假设我有指针数组:

char* buf = new char[256];

如果我这样做,数组指针的值/大小会发生什么

buf -= 100;
c++ pointers math
2个回答
5
投票

+
+=
-
-=
移动指针。

指针

char* ptr = new char[256]
指向256字节块的开头。

所以

ptr+10
是指向10英寸的指针,
ptr+=10
ptr = ptr+10
相同。

这称为指针算术。

在 C++ 中,如果结果使您脱离了指针所指向的对象,或者超出了末尾一位,则指针算术不再有效。因此,

ptr-0
ptr+256
是您可以从
ptr
生成的唯一有效位置。

ptr-=100
是未定义的行为。

在 C++ 中,当前活跃的大多数实现都将指针作为无符号整数索引实现到运行时的平面地址空间中。这仍然并不意味着您在进行指针算术时可以依赖这个事实。每个指针都有一个有效范围,超出这个范围,C++ 标准不再定义程序中的任何内容 (UB)。

未定义的行为不仅仅意味着“可能出现段错误”;编译器可以自由地做“任何事情”,并且存在编译器优化整个代码分支的实例,因为达到它们的唯一方法需要 UB,或者因为它证明,如果达到它们,就会发生 UB。 UB 使得你的程序的正确性基本上无法推理。 话虽这么说,99/100+次将会发生的是,

ptr-=100

现在指向堆中与初始化时不同的部分,并且读/写它所指向的内容将导致获取垃圾,损坏内存和/或段错误。并且执行

+=100
将使
ptr
回到有效范围。
内存块不会因移动

ptr

而受到干扰,只是

ptr
不会指向其中。
    


1
投票

在一些奇怪的机器上,即使只是这种计算也可能使程序崩溃(它们有专门用于指针的寄存器,如果它们指向非映射页面/无效地址,则被捕获)。

实际上,在非病态机器上

计算

该指针不会做太多事情 - 您可能只会获得一个指向无效内存位置的指针(在尝试取消引用它时可能会导致程序崩溃),或者更糟糕的是,您不拥有的内存(因此您可能会覆盖不相关的数据)。 这种情况可能合理的唯一情况是,如果您对内存分配器有“内部知识”(或者您实际上已经用自己的内存分配器替换了它,例如提供您自己的全局

new

运算符的覆盖),并且您知道实际数组在返回的地址之前开始 - 可能存储额外的数据。

    

© www.soinside.com 2019 - 2024. All rights reserved.