C++ 尝试在结构向量的元素内动态分配数组

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;

我有一个点类型的向量(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;

    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++时也花了我一段时间。但是你已经走上了正确的轨道,因为你已经使用了<代码>矢量for
    v
    -基于范围的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 <= !!!