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