你好,我写了这个简单的代码来扩展一个二维数组,当没有元素大于5时,但它似乎不起作用。
#include<iostream>
using namespace std;
void expand(char ** &arr, int rows, int noofelements )
{
char** temparr;
rows += 5;
temparr = new char* [rows];
for (int i = 0; i < noofelements; i++)
{
temparr[i] = arr[i];
}
delete[]arr;
arr = temparr;
cout << "******\narray was expanded\n*****\n";
}
int main()
{
char** arr;
int rows = 5,noofelements=0;
arr = new char* [rows];
for (int i = 0; i < rows; i++)
{
arr[i] = new char[50];
}
while (1)
{
if (noofelements < rows)
{
cout << "enter string\n";
cin.getline(arr[noofelements++], 50);
}
else
{
expand(arr, rows, noofelements);
cout << "enter string\n";
cin.getline(arr[noofelements++], 50);
}
}
}
在调用expand函数后,程序随机结束,并且在使用调试器后,我得到一个抛出的异常错误。
1条答案
按热度按时间xpcnnkqh1#
首先,我知道你学习了CPP和低级内存分配。
在C++中不应该这样做。基本上,不鼓励使用原始指针来表示所拥有的内存。
但是,许多教师在使用唯一适合此任务的容器之前,先从
new
和delete
开始:std::vector
和std::string
让我们来看看你的问题。
首先,如果你展开一个有5个元素的2d数组,那么你在函数中将“rows”增加5。但是因为通过值传递了“rows”变量,所以当进入函数时,会产生一个副本。然后副本将增加5。如果函数返回,在main函数中设置的out rows仍然是5,而不是10。
如果你试图访问元素5..9,你会遇到一个越界的问题,因为它的行为是未定义的。许多IDE/编译器在调试模式下会显示一个运行时错误。
解决方案:传递“rows”作为引用:
void expand(char**& arr, int& rows, int noofelements)
下一个问题是在你的“expand函数中。看,在main中你为每个行指针分配内存。所以,你分配
arr[i] = new char[50];
在子函数中,你不需要对扩展的元素做这个操作。你只需要复制原来的5个指针。其他5个新元素是不确定的。它们没有意义的完整值。
而且,如果你稍后在
main
中尝试在那里放一个值,那么就没有分配的内存。系统将显示未定义的行为,或者崩溃。解决方案是,像在main中一样,也为所有新的扩展指针分配
new char[50]
元素。你可以像下面这样做:
我假设这只是测试代码,所以,我不评论进一步的问题。