C++ 复制阵列-将阵列加倍后崩溃

C++ 复制阵列-将阵列加倍后崩溃,c++,arrays,C++,Arrays,我在这个程序中遇到了一些问题,我知道我可以使用向量,但我尝试只使用数组。一旦程序达到初始数组大小1000,在复制数据后,它应该将数组加倍(在本例中为2000)。举个例子,如果我有一个3000个名字的列表,它会翻一番,一次是1000个,然后又翻了一番,是2000个——总共是4000个。我不完全清楚为什么在我将数组大小增加一倍后它会崩溃。有人能帮我吗 #include <iostream> #include <fstream> #include <string.h>

我在这个程序中遇到了一些问题,我知道我可以使用向量,但我尝试只使用数组。一旦程序达到初始数组大小1000,在复制数据后,它应该将数组加倍(在本例中为2000)。举个例子,如果我有一个3000个名字的列表,它会翻一番,一次是1000个,然后又翻了一番,是2000个——总共是4000个。我不完全清楚为什么在我将数组大小增加一倍后它会崩溃。有人能帮我吗

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;

struct Information {
  char functionality;
  string SSN;
  string name;
};

Information* person;
int numPeople = 1000;
int numRetrieved = 0;
int numArray = 0;
int numInserted = 0;
int numDeleted = 0;


void doubleArray(Information *person){
  numPeople = numPeople * 2;
  Information* temp = new Information[numPeople];
  memcpy(temp, person, numPeople/2);
  delete[] person;
  person = temp;
  cout << "Person 1: " << person[0].name << " " << person[0].SSN << endl;
}
//Currently not using this until I figure out the double...
void halfArray(Information *person){
  numPeople = numPeople / 2;
}

void deleteInfo(Information *person, string SSN){
  for(int i = 0; i < numArray; i++){
    if(person[i].SSN == SSN){
      for(int k = i; k < numArray-1; k++){
        person[k].SSN = person[k+1].SSN;
        person[k].name = person[k+1].name;
      } 
      numArray--;
      numDeleted++;

      if((numArray+1) < (numPeople / 4)){
        //halfArray(person);
      }
    }
  }
}

void retrieve(Information *person, string findSSN, int lastPerson){
  for(int i = 0; i < lastPerson; i++){
    if(person[i].SSN == findSSN){
        numRetrieved++;
    }
  }
}

void insert(Information *person, string SSN, string name){
  if(numArray == (numPeople - 1)){
    doubleArray(person);
  }

  bool dontInsert = false;
  for(int i = 0; i <= numArray; i++){
    if(person[i].SSN == SSN){
      dontInsert = true;    
    }
  }

  if(dontInsert){
    dontInsert = false;
  }else{
    person[numArray].SSN = SSN;
    person[numArray].name = name;
    numArray++;
    numInserted++;
  }
}

int main(int argc, char* argv[]) {
    person = new Information[numPeople];
    char firstLetter;
    string SSN, firstName, lastName, name; 
    fstream input(argv[1]);

    for(int i = 0; !input.eof(); i++){
        input >> firstLetter >> SSN >> firstName >> lastName;
        name = firstName + " " + lastName;

        switch(firstLetter){
            case 'd':{
                deleteInfo(person, SSN);
                break;
            }
            case 'i':{
                insert(person, SSN, name);
                break;
            }
            case 'r':{
                retrieve(person, SSN, numArray);
                break;
            }
        }
    }
    input.close();
}
#包括
#包括
#包括
使用名称空间std;
结构信息{
字符功能;
字符串SSN;
字符串名;
};
信息*人;
int numpople=1000;
int numRetrieved=0;
int numArray=0;
int numInserted=0;
int numDeleted=0;
无效双数组(信息*人){
numpople=numpople*2;
信息*temp=新信息[numPeople];
成员(临时、人员、员工/2);
删除[]人;
人员=临时工;
cout firstName>>lastName;
name=firstName+“”+lastName;
开关(第一个字母){
案例“d”:{
deleteInfo(个人,SSN);
打破
}
案例“i”:{
插入(人员、SSN、姓名);
打破
}
案例“r”:{
检索(人员、SSN、numArray);
打破
}
}
}
input.close();
}

您删除了
信息*
指向的内存,但您有该指针的副本,并且将其分配给
temp
变量在
doubleArray
之外没有任何效果

假设传入的person的值为0xC001C001

void doubleArray(Information *person){
  numPeople = numPeople * 2;
  Information* temp = new Information[numPeople];
  memcpy(temp, person, numPeople/2);
  delete[] person;
  person = temp;
  cout << "Person 1: " << person[0].name << " " << person[0].SSN << endl;
}

您能找出它在哪一行崩溃或错误消息吗?
memcpy
的最后一个参数是以字节为单位的大小,而不是要复制的数组的大小。
void insert(Information *person, string SSN, string name){
  if(numArray == (numPeople - 1)){
    doubleArray(person);
  }

  bool dontInsert = false;
  for(int i = 0; i <= numArray; i++){
    if(person[i].SSN == SSN){
      dontInsert = true;    
    }
  }
void redo(P** p)
{
  P* temp = new P();
  delete *p;
  *p = temp;
}