2016-08-15 50 views
1

我是C++的新手,我的編譯器向我拋出一個錯誤,這對於理解可能是什麼行號是沒有幫助的。在C++中向量中的malloc錯誤

我的代碼是Add_1.cpp:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <math.h> 
using namespace std; 
vector<int> plusOne(vector<int> &A) { 

    int start=-1; 
    for(int i=0;i<A.size()-1;i++) 
    { 
     if(A[i]>0) 
     { 
      break; 
     } 
     if(A[i]==0 && A[i+1]!=0) 
     { 
      start=i; 
      break;   
     } 

    }// Truncated Leading 0's 
    vector<int> ans(A.size()-start); 
    int flag=1; 
    for(int i=A.size()-1;i>start;i--) 
    {  
     if(A[i]==9) 
     { 
      if(flag==1) 
      { 
       ans[i+1]=0; 
       flag=1; 
      } 
      else 
      { 
       ans[i+1]=A[i]; 
      } 
     } 
     else 
     { 
      ans[i+1]=A[i]+1; 
      flag=0; 
     } 
    } 

    for(int i=0; i<ans.size(); i++) 
     { 
      // cout<<"Here too"<<endl; 
      cout<< ans.at(i) <<" "; 
     } 
    // if(ans[0]==0) 
    // { 
    // vector<int> ans1(ans.size()-1); 
    // copy(A.begin()+1,A.end(), ans1.begin()); 
    // return ans1; 
    // } 
    return ans; 
} 



int main() 
{ 
    vector <int> A ={0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; 
    vector <int> k (plusOne(A)); 
    // cout<<ans.size()<<endl; 
    for(int i=0; i<k.size(); i++) 
     { 
      // cout<<"Here too"<<endl; 
      cout<< k.at(i) <<" "; 
     } 
     cout<<endl; 

    return 0; 
} 

當我編譯(g++ -std=c++11 Add_1.cpp -o Add)和run(./Add),我拋出這個錯誤:

Add: malloc.c:2395: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. 
Aborted (core dumped) 

我上閱讀了一下這個,我所知道的是,這樣的錯誤可能是由於錯誤地使用了指針引起的。我仍然不明白這與我的錯誤有什麼關係。

有人可以解釋代碼有什麼問題,應該如何解決?

該代碼託管在codepad

此代碼的問題語句是:

鑑於表示爲數字的陣列,加一到數的非負數。而且,這些數字被存儲起來,使得最有效的數字位於列表的頭部。

+0

您是否嘗試過使用調試器? –

+0

如果(i [i] == 0 && A [i + 1]!= 0)'如果'i'在最後一個條目上,則超出邊界。之後你也會在循環中執行'i + 1',這取決於內容,'i'可能在最後一個條目上。在進行數組訪問時考慮*邊界條件* –

+0

@ M.M:對於來自main的給定輸入,永遠不會達到邊界條件。錯誤在別處。儘管如此,我已經糾正了它,但並不能真正解決它。 – FlyingAura

回答

1

不確定這是你尋找的問題,但是......如果我沒有錯,這是一個問題。

您聲明ans作爲

vector<int> ans(A.size()-start); 

是大小A.size()-startstd::vector

我們有start可以是-1或值[0, A.size()-2]範圍內。

考慮當start大於零的情況;例如,假設start == 3。在這種情況下,尺寸爲ansA.size() - 3)的尺寸小於A的尺寸。

以下週期是

for(int i=A.size()-1;i>start;i--) 

所以對於i所述第一值是A.size() - 1即更大的ans尺寸。

的問題是,你在這個循環中,寫

ans[i+1] 

讓你在一個超出範圍位置ans寫和不綁定的檢查。

這可以摧毀內存和(我想)可以解釋你的問題。

建議:替代

ans[i+1]=0; 
//... 
ans[i+1]=A[i]; 
//... 
ans[i+1]=A[i]+1; 

ans.at(i+1) = 0; 
//... 
ans.at(i+1) = A[i]; 
//... 
ans.at(i+1) = A[i]+1; 

這是因爲at()進行綁定檢查,並在情況下,拋出異常。

如果我是對的,你應該改變你的malloc錯誤的例外。

+0

謝謝!這是有道理的。 – FlyingAura