PE14-1编程练习.exe 中的 0x58742258 (msvcp100d.dll) 处有未经处理的错误: 0xC0000005: 写入位置 0x00000

PE14-1编程练习.exe 中的 0x58742258 (msvcp100d.dll) 处有未经处理的异常: 0xC0000005: 写入位置 0x00000
程序能编译,但是运行的时候写入数据提示
PE14-1编程练习.exe 中的 0x58742258 (msvcp100d.dll) 处有未经处理的异常: 0xC0000005: 写入位置 0x00000
C/C++ code

#include "stdafx.h"
#include <iostream>
#include <valarray>
#include <string>
#include <cstring>
using namespace std;

template <typename T1, typename T2>
class Pair
{
private:
    T1 a;
    T2 b;
public:
    T1 first() { return a; }
    T2 second() { return b; }
    Pair (const T1 & t1, const T2 & t2) : a (t1), b (t2) { }
    Pair () { }
};

class Wine
{
private:
    typedef valarray<int> ArrayInt;
    typedef Pair<ArrayInt, ArrayInt> PairArray;
    string label;
    int year;
    PairArray pa;
public:
    Wine (const char * l, int y, const int yr[], const int bot[]) 
        : label (l), year (y),  pa(ArrayInt(yr, year), ArrayInt(bot, year)) { }
    Wine (const char * l, int y) : label (l), year (y) { }
    void GetBottles();
    string & Label() { return label; }
    int Sum();
    void Show();
};

void Wine::GetBottles()
{
    cout << "Enter " << label << " data for " << year << " year(s):\n"; 
    for (int i = 0; i < year; i++)
    {
        cout << "Enter year: ";
        cin >> pa.first()[i];
        cout << "Enter bottles for that year: ";
        cin >> pa.first()[i];
    }
}
void Wine::Show()
{
    cout << "Wine: " << label << endl;
    cout.width(4);
    cout << "Year";
    cout << "    ";
    cout.width(7);
    cout << "Bottles" << endl;
    for (int i = 0; i < year; i++)
    {
        cout.width(4);
        cout << pa.first()[i];
        cout << "    ";
        cout.width(7);
        cout << pa.second()[i];
    }
}
int Wine::Sum()
{
    int sum = 0;
    for (int i = 0; i < year; i++)
    {
        sum += pa.first()[i];
    }
    return sum;
}


int main()
{
    cout << "Enter name of wine: ";
    char lab[50];
    cin.getline(lab, 50);
    cout << "Enter number of years: ";
    int yrs;
    cin >> yrs;

    Wine holding(lab, yrs); //stors label, years, give arrays yrs elements
    holding.GetBottles();
    holding.Show();

    const int YRS = 3;
    int y[YRS] = {1993, 1995, 1998};
    int b[YRS] = {48, 60, 72};
    //create new object, initialize using data in array;s ;y and b 
    Wine more("Gushing Grzpe Red", YRS, y, b);
    more.Show();
    cout << "Total bottles for " << more.Label() //use Label() method
        << ": " << more.Sum() << endl; //use sum() method
    cout << "Bye\n";
    return 0;
}



------解决方案--------------------
0xC0000005是内存访问违规
单步调试下吧。注意指针,越界等问题
------解决方案--------------------
C/C++ code
   char lab[50] = {0};  // 初始化下
    cin.getline(lab, 50-1); // 至少留一个要给字符串结束符 \0

------解决方案--------------------
探讨

C/C++ code
char lab[50] = {0}; // 初始化下
cin.getline(lab, 50-1); // 至少留一个要给字符串结束符 \0