2013-11-25 29 views
1

该程序崩溃,无法找到有关获取数组内容和移动指针的非法操作。哪里不对?在数组中移动指针

#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; 
} 
+1

问题:为什么你首先使用'new'?你正在经历很多额外的旋转才能获得你从''p'数组/''std :: vector' /'std :: array'局部到'main'所得到的结果。你已经得到了很多关于如何防止'new' /'delete'崩溃的建议,但是没有人指出你不应该用它们来开始(甚至当你需要类似'新'的功能时,你应该看看'make_shared'和'make_unique',而不是直接使用'new')。 –

+0

@JerryCoffin让我回答这个问题 - 主要是因为大多数C++书籍,资源,课程(甚至是大学的课程)仍然倾向于展示如何在C中实现链表,然后用C++编译器进行编译。人们仍在教导别人如何在“C贫民窟”内感到舒适(就像Bartosz Milewski所说的那样)。 –

回答

6

你改变你的p指针,然后你想原来分配的内存后删除记忆:

delete [] p; 

保存原来的指针一些临时的迭代器指针,并增加它,而不是原始的:

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

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

2

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