提问者:小点点

为什么我能够递增指向单个新int位置的指针? 令人惊讶的是它工作得很好


这是怎么回事,它是有效的,但它仍然模棱两可。 谁能告诉我更多关于这一点,或至少指出我一些相关的来源,以了解更多

#include <iostream>
#include <string>
int main()
{
    std::string br="\n";
    long *a=new long;
    *++a=121;
    *++a=545454;
    *++a=232;
    std::cout<<*a<<br<<a<<std::endl;
    a--;
    //delete a;
    std::cout<<*a<<br<<a<<std::endl;
    a--;
    //delete a;
    std::cout<<*a<<br<<a<<std::endl;
    delete a;
    
    pause;//macro for windows("pause")
}

共3个答案

匿名用户

您所做的并不是真的令人惊讶,但它的定义并不正确。
当您使用对象调用new时,堆分配器会分配一些空间来存储对象。
您所做的只是增加指针以指向一些未分配的内存。 正如您注意到的,您可以向它写入,但这将导致未定义的行为,因为还可能存在另一个由您分配的对象,或者您可以重写堆用来组织其内存的某些数据结构。
长话短说,不要向以前未分配的内存写入。

匿名用户

这是有效的,因为a是指向堆中内存位置的长指针。 堆由运行时使用的巨大内存块组成。 简而言之,在递增a的同时,a指向New分配的内存位置的下一个(可能不连续)内存位置。

一些参考资料:

https://stackoverflow.com/A/44822977/8584523

https://www.geeksforgeeks.org/stack-vs-heap-memory-allocation/

匿名用户

因为它是指针,语言是C/C++。 long指针的大小为8字节,因此可以帮助您访问高达20 TB(实际上几乎接近21 TB)的内存大小,与您当前拥有的内存量相比,这绝对是巨大的。 指针只不过是指向某个内存位置的变量。 现在,指针的移动只受因素的限制,即分配给你的程序多少大小的内存。

如果您的程序有所有可用的内存(就像操作系统一样),您也可以使用单个指针在整个内存中移动。 但是就其他程序而言(它们不是OSs),你可以自由地做同样的事情,直到你移出你的程序内存。 这通常会导致诸如分段错误内存访问违规错误等错误。

这就是为什么人们通常会避免使用指针的原因,而大多数现代语言都没有指针。