2013-11-25 31 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

將數組的開始指針保存在另一個指針中,並刪除末尾的舊指針。