Ошибка msvcr110d.dll! memcpy при тестировании структур и массивов

0

Мне было интересно, может ли кто-нибудь взглянуть на то, почему я получаю ошибки во время выполнения.

Исключение первого шанса в 0x6FBDEBC2 (msvcr110d.dll) в Project1.exe: 0xC0000005: место записи нарушения доступа 0x7CB67DEB. Необработанное исключение в 0x6FBDEBC2 (msvcr110d.dll) в Project1.exe: 0xC0000005: место записи нарушения доступа 0x7CB67DEB.

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main(){
    struct person {
        string name;
        int age;
        int weight;
        string nickname;
    } ;

    person people[1];

    for(int i = 0; i < sizeof(people); i++){
        string s[4];
        for(int x = 0; x < 4; x++){
            cout << "Please enter person " << i << " " << (x == 0 ? "name" : x == 1 ? "age" : x == 2 ? "weight" : x == 3 ? "nickname" : "unknown") << "." << endl;
            getline(cin, s[x]);
        }
        people[i].name = s[0];
        stringstream(s[1]) >> people[i].age;
        stringstream(s[2]) >> people[i].weight;
        people[i].nickname = s[3];
    }

    for(int i = 0; i < sizeof(people); i++)
        cout << "Person " << i << ": name = " << people[i].name << ", age = " << people[i].age << ", weight = " << people[i].weight << ", nickname = " << people[i].nickname << endl; 

    cout << "Please press enter to continue.";
    fflush(stdin);
    cin.clear();
    cin.get();
}

Он работает очень хорошо до второго цикла, где, как представляется, выполняется ошибка.

Теги:
dll
arrays
c++11
structure

2 ответа

3

Ваша проблема здесь:

sizeof(people)

Это не дает вам длину массива people, а общий размер массива в байтах. Вы можете использовать std::begin(people) и std::end(people) чтобы получить итераторы в начале и один за концом массива.

for (auto it = std::begin(people); it != std::end(people); ++it)
{
  // it is an iterator to an element of people
  it->name = ....;
}

Кроме того, вы можете использовать цикл на основе диапазона:

for (auto& p : people)
{
  // p is a reference to an element of people here
  p.name = ....;
}
0

Чтобы предотвратить такую проблему, рассмотрите этот подход, который позволяет хранить размер статического массива:

int ARRAY_SIZE = 1;
person people[ARRAY_SIZE];

Затем ваш цикл for:

for(int i = 0; i < ARRAY_SIZE; i++)
  • 2
    Осторожно, размер массива должен быть константой времени компиляции (в C++ ).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню