在地址 0x0 处使用 C++ 向量写入大小无效
Invalid Write Size using C++ Vectors at Address 0x0
我正在努力提高我在 C++ 方面的知识,我编写这个程序是为了尝试处理向量。该程序本身在语法上是正确的,但是当我编译时我得到了 SEG FAULT 11。然后我在代码上 运行 Valgrind,我得到了 invalid write size 4
错误和 Address 0x0 is not stack'd, malloc'd or (recently) free'd
。这是我的代码
#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
这个:
vector<int> a;
创建一个空向量,因此通过运算符[]访问任何元素(包括0)都是UB。调用 std::vector::resize()
或通过 std::vector::push_back()
或 std::vector::emplace_back()
添加新元素
您的矢量没有元素,因此即使访问 a[0]
也是非法的(更准确地说,undefined behavior)。给你的向量一个初始大小:
vector<int> a(n);
^^^
我正在努力提高我在 C++ 方面的知识,我编写这个程序是为了尝试处理向量。该程序本身在语法上是正确的,但是当我编译时我得到了 SEG FAULT 11。然后我在代码上 运行 Valgrind,我得到了 invalid write size 4
错误和 Address 0x0 is not stack'd, malloc'd or (recently) free'd
。这是我的代码
#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
这个:
vector<int> a;
创建一个空向量,因此通过运算符[]访问任何元素(包括0)都是UB。调用 std::vector::resize()
或通过 std::vector::push_back()
或 std::vector::emplace_back()
您的矢量没有元素,因此即使访问 a[0]
也是非法的(更准确地说,undefined behavior)。给你的向量一个初始大小:
vector<int> a(n);
^^^