我正在尝试将名称读入20行的2d动态数组中,并且名称的长度不受限制。由于引入了超过初始值10的新长度,程序在最后崩溃时出现“堆损坏”错误。但是,遇到的唯一问题是当我运行循环以删除上述单元格时。有谁知道如何删除长度不同于初始值的单元格? (特别是在这种情况下。)我是否需要使数组中的所有单元格成为新的长度?附:我不能使用向量,因为这是一项禁止它们的家庭作业。
确定。这是@RetiredNinja建议更改的更新版本。它运行得很好,我在以前测试的任何条件下都不会出现“堆损坏”错误。
#include <iostream>
using namespace std;
#include <memory.h>
#include <string.h> // will be used once I write the sort and search functions
char * ReadString();
void main ()
{
bool contMain=true;
const long numNames=20;
long nameAc=0;
char ** ppNames, c;
ppNames=new char* [numNames];
char test;
while(contMain && nameAc<numNames)
{
ppNames[nameAc]=ReadString();
test=ppNames[nameAc][0];
if(test=='\0')
{
contMain=false;
break;
}
else;
nameAc++;
}
for(int i=0; i<nameAc; i++)
cout<<ppNames[i]<<endl;
// deallocation
for(int i=0; i<nameAc; i++)
{
cout<<i<<endl;
delete ppNames [i];
}
delete[] ppNames;
}
char * ReadString()
{
long aSize=10;
long numChars (0);
char * pNames;
char * pTemp;
char c;
pNames=new char [aSize+1];
while((c = cin.get()) != '\n')
{
if(numChars >= aSize)
{
aSize *= 2;
pTemp = new char[aSize + 1];
memcpy(pTemp, pNames, numChars);
delete[] pNames;
pNames = pTemp;
cout << "Array size increased to " << aSize << endl;
}
pNames[numChars++] = c;
}
pNames[numChars] = '\0'; //end of string
return pNames;
}
答案 0 :(得分:0)
你的大部分代码都没有多大意义。你分配和删除相当随意地经常撤消你之前几行所做的事情。
尝试这样的事情:
char * ReadString()
{
long aSize = 10;
long numChars = 0;
char * pNames;
char * pTemp;
char c;
pNames = new char[aSize + 1];
while((c = cin.get()) != '\n')
{
if(numChars >= aSize)
{
aSize *= 2;
pTemp = new char[aSize + 1];
memcpy(pTemp, pNames, numChars);
delete[] pNames;
pNames = pTemp;
cout << "Array size increased to " << aSize << endl;
}
pNames[numChars++] = c;
}
pNames[numChars] = '\0';//end of string
return pNames;
}