C++ 尝试在结构向量的元素内动态分配数组
我有一个点类型的向量(point是一个包含2个int和一个指向int,s的指针的结构),我试图为s数组(malloc/new)动态分配内存,并向其添加两个值,但它给了我seg fault。我不知道我是否被允许在向量元素中这样做。先谢谢你C++ 尝试在结构向量的元素内动态分配数组,c++,arrays,vector,dynamic-memory-allocation,C++,Arrays,Vector,Dynamic Memory Allocation,我有一个点类型的向量(point是一个包含2个int和一个指向int,s的指针的结构),我试图为s数组(malloc/new)动态分配内存,并向其添加两个值,但它给了我seg fault。我不知道我是否被允许在向量元素中这样做。先谢谢你 struct point{ int x, y; int *s; }; int main(void){ int n, val1, val2, val3, val4, i; vector<point> v;
struct point{
int x, y;
int *s;
};
int main(void){
int n, val1, val2, val3, val4, i;
vector<point> v;
v.resize(2);
cin >> n;
for(i = 1; i <= n; i++)
{
cin >> val1 >> val2 >> val3 >> val4;
v[i - 1].x = val1;
v[i - 1].y = val2;
v[i - 1].s = new int[2]; // here i think is the problem.
//v[i - 1].s = (int *)malloc(2 * sizeof(int));
v[i - 1].s[0] = val3;
v[i - 1].s[1] = val4;
}
for(i = 0; i <= v.size(); i++)
{
cout << v[i].x << " " << v[i].y << " " << v[i - 1].s[0] << " " << v[i - 1].s[1] ;
cout << "\n";
}
return 0;
}
结构点{
int x,y;
int*s;
};
内部主(空){
int n,val1,val2,val3,val4,i;
向量v;
v、 调整大小(2);
cin>>n;
对于(i=1;i>val1>>val2>>val3>>val4;
v[i-1].x=val1;
v[i-1].y=val2;
v[i-1].s=new int[2];//我想这就是问题所在。
//v[i-1].s=(int*)malloc(2*sizeof(int));
v[i-1].s[0]=val3;
v[i-1].s[1]=val4;
}
对于(i=0;i
- 您不需要将
resize()
向量调整为n
。您有一个固定值2
。这将使程序在std::cin>>n
中输入大于2
的内容时具有未定义的行为
- 第二个循环
(i=0;i
不是问题。s
是向量中元素的一个成员这一事实并不是真正相关的。如上所述是正确的:
int* s;
s = new int[2]; // here i think is the problem.
s[0] = val3;
s[1] = val4;
这是一个问题,因为不清楚为什么要在这里使用手动分配的数组。当我看到std::vector
和new int[2]时,我总是有点困惑
在同一代码中。从向量中,您可以从动态分配的数组和更多数组中获得所有信息。无论如何,导致SEGFULT的问题在别处
v.resize(2);
cin >> n;
for(i = 1; i <= n; i++)
{
cin >> val1 >> val2 >> val3 >> val4;
v[i - 1].x = val1;
....
为什么不使用std::vector s;
来代替呢?另外,如果n
大于您在v
中的位置,会发生什么情况?为什么i-1
而不是在0
处开始循环?s
中总是有2个整数?如果是这样,那么std::array
可能更合适。i使用新的b因为我已经习惯了C,在C中,你必须用malloc、realloc、calloc动态分配数组。现在我开始理解向量。事实上,我犯了一些巨大的错误在现代C++中,它非常罕见,必须使用<代码>新< /代码>。容器和智能指针覆盖动态分配的大多数情况:首先,我只使用2个元素插入向量(从这里V.ResiSt(2))当我切换到N时,我忘记了改变它。我真的理解了你的两种解决方案,实际上使用向量S代替int型是更好的方法,但是我仍然习惯于C的做事方式。@斯蒂芬斯:是的,那部分在从C到C++时也花了我一段时间。但是你已经走上了正确的轨道,因为你已经使用了<代码>矢量forv
-基于范围的for循环非常简洁。在使用它们时,必须遍历循环中的所有元素时很少出错。
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;
int* s;
s = new int[2]; // here i think is the problem.
s[0] = val3;
s[1] = val4;
v.resize(2);
cin >> n;
for(i = 1; i <= n; i++)
{
cin >> val1 >> val2 >> val3 >> val4;
v[i - 1].x = val1;
....
for(i = 0; i < v.size(); i++)
// ^^ not <= !!!