2016-07-14 67 views
0

我正在努力提高自己在C++中的知识,并且我编写了此程序以尝试处理向量。程序本身在语法上是正确的,但是当我编译时,我得到了一个SEG FAULT 11.所以然后我运行了Valgrind的代码,并且我得到了一个invalid write size 4错误,并且还有Address 0x0 is not stack'd, malloc'd or (recently) free'd。这里是我的代码在地址0x0处使用C++向量的无效写入大小

#include <vector> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

const int TTO = 2147483648; 
int main() 
{ 
    int n, s, p, q, i; 
    cin >> n >> s >> p >> q; 
    vector<int> a; 
    a[0] = s % TTO; 
    for(i = 1; i < n; i++) 
     a[i] = (a[i-1]*p+q) % TTO; 
    sort(a.begin(), a.end()); 
    a.erase(unique(a.begin(), a.end()), a.end()); 
    cout << a.size() << endl; 
    return 0; 
} 

我能做些什么来得到这个不是SEG FAULT

编辑:我使用的输入是3 1 1 1

+0

我不确定是否是这种情况,但是当* undefined behavior *被调用时,会发生任何事情。 – MikeCAT

+1

'resize()'你的向量在使用之前:'a [0]'。 –

+0

@πάνταῥεῖ像这样'a.resize()'? –

回答

3

你的向量没有元素添加新的元素,所以即使访问是a[0]非法的(更确切地说,undefined behavior)。给你的向量初始大小:

vector<int> a(n); 
      ^^^ 
+0

谢谢!我没有意识到载体需要一个初始大小。我试图更好地调试我的C++代码并识别UB。 –

2

此:

vector<int> a; 

创建一个空的载体,由操作者所以访问的任何元素(包括0)[]是UB。无论是打电话std::vector::resize()std::vector::push_back()std::vector::emplace_back()