如何防止这个2d动态数组程序崩溃?

时间:2013-11-17 23:49:17

标签: c++ arrays dynamic 2d allocation

确定。因此,该程序应该以未知长度读取未知数量的名称,并且一旦用户按空白行上的回车键,就应该停止读取名称。在我看的每个地方,有人说使用矢量。但是,这适用于特别需要动态数组的赋值。到目前为止,程序将读取第一个名称,然后当您输入第二个名称时,它将崩溃。它与我如何启动/分配数组有关吗?任何帮助都会非常感激,因为这件事困扰了我好几天。

#include <iostream>

using namespace std;


int main ()
{
    long numnames=0
    long namelength=0;
    char ** pNames;
    pNames = new char* [numnames];
    pNames [numnames] = new char [namelength];
    char c;
    bool cont=true;

while(cont)
{
    while ((c=cin.get())!='\n') // input loop
    {
        pNames [numnames] [namelength++]=(c);
    }

    pNames[numnames] [namelength]='\0'; // end of string mark
    if(c='\n' && namelength==0) //if enter is pressed on an empty line, stop reading names
        cont=false;
    else
    {
        numnames++;
        namelength=0;
    }   
}
cout<<pNames<<endl; // used as a progress marker

for(int i=0; i<=numnames; i++) // mem clear loop
    delete [] pNames [i];
delete [] pNames;

return 0;
}

1 个答案:

答案 0 :(得分:0)

好像你试图通过改变'numnames'的值来改变数组的大小

如果将数组的大小设置为变量,则更改变量时将更改数组的大小。您有两个选择:复制数组的内容,重新分配数组,然后移回内容,或者您​​可以创建一个具有新大小的新数组并复制元素。

我将展示第二种方式。请注意,这是伪代码,这意味着它不应该直接使用。该数组的类型为“int”。您必须自己实现此代码。

// This function resizes an int array 'array'
// of size 'size' to the size of 'newSize'
void resize(int size, int newSize, int* array)
{
    // The array of the new size
    int* newArray = new int[newSize];

    // 'memcpy' copies over the elements of one array to another.
    // The first argument is the array to copy to.
    // The second argument is the array to copy from.
    // The third argument is the size of the array in the second argument.
    memcpy(newArray, array, size * sizeof(int));

    // Deallocates the old array so we can safely make it point to the new array.
    delete[] array;

    // Since the old array is deallocated, we can make it point to the address of
    // the new array without it becoming a memory leak.
    array = newArray;

    // The original array's size has now been changed, and you can
    // safely change it's values normally after it's been resized.
}

请记住阅读本文并理解它。如果您无法理解这一点,那么我建议您阅读有关指针和动态数组的更多信息。一旦理解,重写它以满足您的需求。

我还强烈建议为动态数组创建一个模板化的类。它只会使它更加方便,它应该避免由于异常导致的任何内存泄漏。 如果您现在还不知道我在说什么,我建议您阅读更多有关模板的内容。

(顺便说一句,我不能保证100%确定这会起作用。我没有时间测试它)