C++ 数组中的移动指针

C++ 数组中的移动指针,c++,C++,这个程序崩溃了,我找不到任何关于获取数组内容和移动指针的非法操作。怎么了 #include <iostream> #include <stdint.h> using namespace std; int main( int argc, char ** argv ) { int * p = new int [20]; for(int i=0 ; i<20 ;i++ ) { p[i]=i;

这个程序崩溃了,我找不到任何关于获取数组内容和移动指针的非法操作。怎么了

#include <iostream>
#include <stdint.h>
using namespace std;


int main( int argc, char ** argv ) {


    int * p =  new int [20];
    for(int i=0 ; i<20 ;i++ )
        {
            p[i]=i;
        }

    for(int i=0 ; i<20 ;i++ )
        {
            printf("%d ",*p );
            p++;
        }


    delete [] p;

    return 0;
}
您正在更改p指针,然后尝试删除原始分配内存之后的内存:

delete [] p;
将原始指针保存到某个临时迭代器指针并递增它,而不是原始指针:

    int *t = p;
    for(int i=0 ; i<20 ;i++ )
    {
        printf("%d ",*t );
        t++;
    }
您正在更改p指针,然后尝试删除原始分配内存之后的内存:

delete [] p;
将原始指针保存到某个临时迭代器指针并递增它,而不是原始指针:

    int *t = p;
    for(int i=0 ; i<20 ;i++ )
    {
        printf("%d ",*t );
        t++;
    }

您正在删除指向内存块后下一个元素的指针。

您正在删除指向内存块后下一个元素的指针。

将数组的起始指针保存在另一个指针中,并删除末尾的旧指针。

将数组的起始指针保存在另一个指针中,并删除该旧指针指针指向末尾。

问题:你为什么要首先使用new?您需要经历很多额外的旋转,以获得与将p作为一个数组/std::vector/std::array local to main所得到的结果差不多的结果。你已经得到了很多关于如何保持新的/删除的建议,但是没有人指出你不应该使用它们来启动,甚至当你需要新的类似的能力时,你应该看看MaxySoaland MaxIOxIn,而不是直接使用新的.@ JeyycFuin让我回答这个问题——主要是因为大多数C++书籍,资源、课程甚至大学的课程都喜欢展示如何在C中实现链表,然后用C++编译器编译。人们仍在教其他人如何在巴托斯·米列夫斯基(Bartosz Milewski)命名的C区内感到舒适?您需要经历很多额外的旋转,以获得与将p作为一个数组/std::vector/std::array local to main所得到的结果差不多的结果。你已经得到了很多关于如何保持新的/删除的建议,但是没有人指出你不应该使用它们来启动,甚至当你需要新的类似的能力时,你应该看看MaxySoaland MaxIOxIn,而不是直接使用新的.@ JeyycFuin让我回答这个问题——主要是因为大多数C++书籍,资源、课程甚至大学的课程都喜欢展示如何在C中实现链表,然后用C++编译器编译。人们仍在教其他人如何在巴托斯·米列夫斯基命名的C区内感到舒适。