Что за исключение: нарушение доступа для чтения _Pnext было 0xC?

600
25 ноября 2017, 10:37

Пишу программу выводящую на экран таблицу с данными учеников.(ФИО, дата рождения, возраст). Программа работает, но при завершении выдает ошибку

Вызвано исключение: нарушение доступа для чтения. _Pnext было 0xC.

    #include "stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include <windows.h>
#include <conio.h>
using namespace std;
int p[4];
void space(int *x1, int *x2, int *x3, int *x4, int x5) {                //Вычисление кол-ва пробелов в таблице
    if ((*x1 >= *x2) && (*x1 >= *x3) && (*x1 >= *x4) && (*x1 >= x5)) {
        p[0] = 3;
        for (p[1] = 1; p[1] < *x1 + 3 - *x2; p[1]++);
        for (p[2] = 1; p[2] < *x1 + 3 - *x3; p[2]++);
        for (p[3] = 1; p[3] < *x1 + 3 - *x4; p[3]++);
        for (p[4] = 1; p[4] < *x1 + 3 - x5; p[4]++);
    }
    if ((*x2 >= *x1) && (*x2 >= *x3) && (*x2 >= *x4) && (*x2 >= x5)) {
        p[1] = 3;
        for (p[0] = 1; p[0] < *x2 + 3 - *x1; p[0]++);
        for (p[2] = 1; p[2] < *x2 + 3 - *x3; p[2]++);
        for (p[3] = 1; p[3] < *x2 + 3 - *x4; p[3]++);
        for (p[4] = 1; p[4] < *x2 + 3 - x5; p[4]++);
    }
    if ((*x3 >= *x1) && (*x3 >= *x2) && (*x3 >= *x4) && (*x3 >= x5)) {
        p[2] = 3;
        for (p[0] = 1; p[0] < *x3 + 3 - *x1; p[0]++);
        for (p[1] = 1; p[1] < *x3 + 3 - *x2; p[1]++);
        for (p[3] = 1; p[3] < *x3 + 3 - *x4; p[3]++);
        for (p[4] = 1; p[4] < *x3 + 3 - x5; p[4]++);
    }
    if ((*x4 >= *x1) && (*x4 >= *x3) && (*x4 >= *x2) && (*x4 >= x5)) {
        p[3] = 3;
        for (p[0] = 1; p[0] < *x4 + 3 - *x1; p[0]++);
        for (p[2] = 1; p[2] < *x4 + 3 - *x3; p[2]++);
        for (p[1] = 1; p[1] < *x4 + 3 - *x2; p[1]++);
        for (p[4] = 1; p[4] < *x4 + 3 - x5; p[4]++);
    }
    if ((x5 >= *x1) && (x5 >= *x3) && (x5 >= *x2) && (x5 >= *x4)) {
        p[4] = 3;
        for (p[0] = 1; p[0] < x5 + 3 - *x1; p[0]++);
        for (p[2] = 1; p[2] < x5 + 3 - *x3; p[2]++);
        for (p[1] = 1; p[1] < x5 + 3 - *x2; p[1]++);
        for (p[4] = 1; p[4] < x5 + 3 - *x4; p[3]++);
    };
}
struct man      //Структура для хранения информации о людях
{
    string fname;
    string sname;
    string fathername;
    int d, m, y, a;
} ch[4];
int a2(int year, int day, int mounth) {         //Вычисление возраста 
    SYSTEMTIME st;
    GetSystemTime(&st);
    int age = st.wYear - year;
    if (mounth > st.wMonth)
        if (day > st.wDay)
            age--;
    return age;
}
void out(string *name, string *sname, string *fname, int o, int f, int s, int *d, int *y, int *m, int *a) {     //Вывод таблицы на экран
    setlocale(LC_ALL, "rus");
    cout << *sname;
    for (int i = 0; i < s; i++)
        cout << " ";
    cout << *name;
    for (int i = 0; i < f; i++)
        cout << " ";
    cout << *fname;
    for (int i = 0; i < o; i++)
        cout << " ";
    printf("%02u.%02u.%u   %u\n", *d, *m, *y, *a);
}
void in(int d, int m, int y, int i) {       //Передача данных о дате рождения в структуру и вычисление возраста
    ch[i].d = d;
    ch[i].m = m;
    ch[i].y = y;
    ch[i].a = a2(ch[i].y, ch[i].d, ch[i].m);
};
int main()
{
    int n[4], f[5], o[5], s[5];
    setlocale(LC_ALL, "rus");
    ch[0].fname = "Иван";
    ch[0].sname = "Гармашев";
    ch[0].fathername = "Юрьевич";
    ch[1].fname = "Андрей";
    ch[1].sname = "Крикливый";
    ch[1].fathername = "Николаевич";
    ch[2].fname = "Илья";
    ch[2].sname = "Ковалев";
    ch[2].fathername = "Александрович";
    ch[3].fname = "Владислав";
    ch[3].sname = "Дмитриев";
    ch[3].fathername = "Артёмович";
    in(04, 04, 2000, 0);
    in(29, 11, 1999, 1);
    in(12, 02, 1998, 2);
    in(30, 10, 2000, 3);
    for (int i = 0; i < 4; i++) 
        n[i] = ch[i].fname.size();
    space(&n[0], &n[1], &n[2], &n[3], 3);
    for (int i = 0; i < 5; i++) 
        f[i] = p[i];
    for (int i = 0; i < 4; i++)
        n[i] = ch[i].sname.size();
    space(&n[0], &n[1], &n[2], &n[3], 7);
    for (int i = 0; i < 5; i++)
        s[i] = p[i];
    for (int i = 0; i < 4; i++)
        n[i] = ch[i].fathername.size();
    space(&n[0], &n[1], &n[2], &n[3], 8);
    for (int i = 0; i < 5; i++)
        o[i] = p[i];
    printf("Бригада №3\n\nКоличество членов бригады: 4\n\nФамилия");
    for (int i = 0; i < s[4]; i++)
        cout << " ";
    cout << "Имя";
    for (int i = 0; i < f[4]; i++)
        cout << " ";
    cout << "Отчество";
    for (int i = 0; i < o[4]; i++)
        cout << " ";
    cout << "Дата         Возраст";
    cout << endl;
    for (int i = 0; i < 4; i++)
        out(&ch[i].fname, &ch[i].sname, &ch[i].fathername, o[i], f[i], s[i], &ch[i].d, &ch[i].y, &ch[i].m, &ch[i].a);
    system("pause");
    return 0;
}
Answer 1
int p[4];
...
for (int i = 0; i < 5; i++)
        o[i] = p[i];

И радостно выход за границы массива при чтении, о чем вам Runtime и говорит.

READ ALSO
PIMPL на unique или shared указателях?

PIMPL на unique или shared указателях?

Привожу код заготовки реализации идиомы pImpl с этого сайта

272
Преобразовать char* в массив double [C++]

Преобразовать char* в массив double [C++]

Здравствуйте, задача состоит в следующем : Изначально нам дан массив double, который нужно зашифровать xor-ом, я привожу массив double к char массиву...

267
QWebEngine pdf рендер таблиц

QWebEngine pdf рендер таблиц

Для формирования отчетов использую QWebEnginePage, из которого можно производить печать в PDF, все очень удобно, но присутствует проблема с печатью...

220
Opengl 3.x ошибка gl.h included before glew.h

Opengl 3.x ошибка gl.h included before glew.h

Изучаю Opengl 3x в исходном коде урока произошла ошибка gl

254