C++ 2D动态数组不能扩展

x6yk4ghg  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(131)

你好,我写了这个简单的代码来扩展一个二维数组,当没有元素大于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函数后,程序随机结束,并且在使用调试器后,我得到一个抛出的异常错误。

xpcnnkqh

xpcnnkqh1#

首先,我知道你学习了CPP和低级内存分配。
在C++中不应该这样做。基本上,不鼓励使用原始指针来表示所拥有的内存。
但是,许多教师在使用唯一适合此任务的容器之前,先从newdelete开始:std::vectorstd::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]元素。
你可以像下面这样做:

#include<iostream>
using namespace std;

void expand(char**& arr, int& rows, int noofelements)
{
    char** temparr;
    rows += 5;
    temparr = new char* [rows];
    int i;
    for (i = 0; i < noofelements; i++)
    {
        temparr[i] = arr[i];
    }
    for (; i < rows; ++i) {
        temparr[i] = new char[50];
    }
    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);
        }
    }
}

我假设这只是测试代码,所以,我不评论进一步的问题。

相关问题