Ошибка проверки во время выполнения # 2 — Поврежден стек вокруг переменной ‘c2d’. с помощью c

#c

#c

Вопрос:

Я готовлюсь к экзамену, и это входит в мой практический тест. Возникает вопрос: «Какой тип ошибки вызывает следующий фрагмент кода?»

Почему возникает ошибка?

 struct C2D {
    double x, y;
};

class Polygon {
    int point;
    C2D arr[];
public:
    Polygon(int point_, C2D arr_[]) {
        point = point_;
        memcpy(arr, arr_, sizeof(C2D) * point);
    };
    void print() const {
        for (int i = 0; i < point; i  ) {
            cout << arr[i].x << " " << arr[i].y << endl;
        }
    };
};


int main() {
    C2D c2d[3];

    c2d[0].x = 1;
    c2d[0].y = 2;

    c2d[1].x = 3;
    c2d[1].y = 4; 

    c2d[2].x = 5;
    c2d[2].y = 6;

    Polygon p1(3, c2d);
    p1.print();
    
    return 0;
}
  

Ответ №1:

Вы не указали количество элементов для элемента

     C2D arr[];
  

так что для этого не выделено никакой памяти.

Вы должны использовать std::vector для динамического распределения элементов.

 #include <iostream>
#include <vector>
#include <cstring>

using std::cout;
using std::endl;

struct C2D {
    double x, y;
};

class Polygon {
    int point;
    std::vector<C2D> arr;
public:
    Polygon(int point_, C2D arr_[]) : arr(point_) { // allocate point_ elements for arr
        point = point_;
        memcpy(arr.data(), arr_, sizeof(C2D) * point); // copy data using data()
    };
    void print() const {
        for (int i = 0; i < point; i  ) {
            cout << arr[i].x << " " << arr[i].y << endl;
        }
    };
};


int main() {
    C2D c2d[3];

    c2d[0].x = 1;
    c2d[0].y = 2;

    c2d[1].x = 3;
    c2d[1].y = 4; 

    c2d[2].x = 5;
    c2d[2].y = 6;

    Polygon p1(3, c2d);
    p1.print();
    
    return 0;
}