如何解决尝试在结构向量的元素内动态分配数组
我有一个点类型的向量(point是一个包含2个int和一个指向int,s的指针的结构),我试图为s数组动态分配内存(malloc / new),并向其添加两个值但这给了我段错误。我不知道是否可以在vector元素内执行此操作。预先谢谢你。
stepper.transform = stepper.transform.scaledBy(x: 1.25,y: 0.9)
解决方法
- 您不会
resize()
到vector
到n
。您的固定值为2
。一旦有人在2
中输入大于std::cin >> n
的内容,这将使程序具有不确定的行为。 - 第二个循环
for(i = 0; i <= v.size(); i++)
将使程序访问v[v.size()]
超出范围,因此您的程序具有未定义的行为。 - 循环
for(i = 1; i <= n; i++)
没错,因为您在循环内用i - 1
进行了补偿,但这是不必要的。做for(i = 0; i < n; i++)
或使用基于范围的for循环(如下所述)。 - 请勿将
new
用于s
。使用固定大小的std::array<int,2>
或可以调整大小的std::vector<int>
。
示例:
#include <iostream>
#include <vector>
struct point {
int x,y;
std::vector<int> s; // use a vector instead of a raw pointer
};
int main() { // not main(void)
int n,val1,val2,val3,val4;
std::vector<point> v;
if(!(std::cin >> n)) return 1; // extraction may fail
v.resize(n); // resize it appropriately
// you can access the `point`s in the vector using a range based for-loop:
for(point& p : v) {
if(std::cin >> val1 >> val2 >> val3 >> val4) { // check if extraction succeeded
p.x = val1;
p.y = val2;
p.s.resize(2);
p.s[0] = val3;
p.s[1] = val4;
} // else /* break,return 1,... something */
}
// You can also access the elements like this,but pay attention
// to the condition: i < v.size()
for(int i = 0; i < v.size(); i++) {
std::cout << v[i].x << ' ' << v[i].y << ' '
<< v[i].s[0] << ' ' << v[i].s[1] << '\n';
}
}
另一种选择是根本不 resize()
v
,而只是使用emplace_back
向其中添加新的point
。请注意,内部vector
s
是如何自动调整大小的:
for(int i = 0; i < n; ++i) {
if(std::cin >> val1 >> val2 >> val3 >> val4) {
v.emplace_back(point{val1,{val3,val4}});
} else
break;
}
还请注意,访问v.s[0]
和v.s[1]
而不检查其实际上是否包含2
个元素会有些冒险,但是如果您知道,情况总是如此在您的初始循环之后,应该没问题。
此
v[i - 1].s = new int[2]; // here i think is the problem.
v[i - 1].s[0] = val3;
v[i - 1].s[1] = val4;
不是问题。 s
是向量中元素的成员这一事实并不是真正相关的。以上是正确的:
int* s;
s = new int[2]; // here i think is the problem.
s[0] = val3;
s[1] = val4;
这是一个问题,因为不清楚为什么要在此处使用手动分配的数组。当我在同一代码中看到std::vector
和new int[2]
时,总是会感到困惑。从向量中,您可以获得从动态分配的数组中获得的所有信息以及更多信息。无论如何,导致段错误的问题在其他地方...
v.resize(2);
cin >> n;
for(i = 1; i <= n; i++)
{
cin >> val1 >> val2 >> val3 >> val4;
v[i - 1].x = val1;
....
v
有2个元素。代码中的任何地方元素的数量都没有变化。当用户为n
输入大于2的任何值时,您将超出范围访问向量。越界访问是未定义的行为。运行代码时,任何事情都可能发生。
您的最后一个循环也是错误的。最后一个有效索引是v.size()-1
。通常使用半开间隔,即包括开始,不包括结束
for(i = 0; i < v.size(); i++)
// ^^ not <= !!!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。