简体   繁体   中英

Run-Time Check Failure #2 - Stack around the variable 'IDNumber' was corrupted

#include <iostream>
#include <string.h>
#include <time.h> 

using namespace std;

struct MyID
{
    char FirstName[10]; // array for lenight of the word.
    char LastName[10]; // array for lenight of the word.
    int IdNumber;
};

void InitializeArray(MyID IDNumber[], int Size);
//void SortTheArray(MyID IDNumber[], int Size);
int main(){
    const int Size = 100;
    MyID IDNumber[Size];

    strcpy_s(IDNumber[Size].FirstName, "Aziz");
    strcpy_s(IDNumber[Size].LastName, "LEGEND");
    // I believe the error is around here. 

    InitializeArray(IDNumber, Size);
    //SortTheArray(IDNumber, Size);
}

void InitializeArray(MyID IDNumber[], int Size){

    //srand(time(0));
    for (int i = 0; i < Size; i++){
        //IDNumber[i].IdNumber = rand() %100 ;

        cout<<IDNumber[i].FirstName<<endl;
        IDNumber[i].LastName;
    }
}

在此处输入图片说明

I have this problem, every time I want to test my function and struct, this error will prompt. Also, I want to see if my name will print correctly before continue to write rest program. The idea is I want to print same name every time without ask user to print name every time. Also, I have upload the picture of result if you want to see it.

Because you are using arrays, you are experiencing buffer overrun error:

const int Size = 100;
MyID IDNumber[Size];

strcpy_s(IDNumber[Size].FirstName, "Aziz");
strcpy_s(IDNumber[Size].LastName, "LEGEND");

The expression IDNumber[Size] is equivalent to IDNumber[100] .

In C++, array slot indices go from 0 to Size - 1 . You are accessing one past the end of the array.

Edit 1: Initializing an array
Based on your comment, you can use a loop to initialize the slots in an array (vector):

struct Person
{
  std::string first_name;
  std::string last_name;
};

const unsigned int CAPACITY = 100;

int main()
{
  std::vector<Person> database(CAPACITY);
  Person p;
  std::ostringstream name_stream;
  for (unsigned int i = 0; i < CAPACITY; ++i)
  {
    name_stream << "Aziz" << i;
    database[i].first_name = name_stream.str();
    database[i].last_name = "LEGEND";
  }
  return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM