C ++动态粗糙数组

时间:2018-02-01 20:32:23

标签: c++ arrays pointers

我一直在努力弄清楚这个任务已经好几个小时了,但还是无法掌握它。我正在尝试从txt文档读取名称,这是有效的,我需要将它们存储在char指针数组中。一旦名称的数量与数组大小一样大,我需要使用REALLOCATION来使数组更大(我不能使用向量库)。

我正在努力改变名称数组大小以使其更大并从内存中删除旧数组(当我写delete []名称时它只会崩溃;)。

这是我目前破解的代码:

int numNames = 2;
    char * names[numNames] = {};
    ifstream namesFile("names.txt");

    //get names from user, put names in ragged array
    int i = 0;
    while (i < numNames) {
        if (namesFile.good() && !namesFile.eof()) {
            //add name to ragged array
            names[i] = new char[257];
            namesFile >> setw(256) >> names[i];
            i++;

            if (i == numNames) {
                //need a bigger array
                numNames *= 2;

                char * temp[20] = {};
                for (int j = 0; j < numNames / 2; j++) {
                    temp[j] = names[j];
                }
                delete [] names;
                names = temp;
            }
        }
        else {
            //end of file or corrupt file
            break;
        }
    }
    namesFile.close();

感谢任何帮助!

1 个答案:

答案 0 :(得分:-1)

以下语句不执行任何动态分配。它只是在大小为pointers to char (char*)的堆栈上声明了一个numNames数组。所以,它无论如何都不是动态的:

 char * names[numNames] = {};

因此,您无法更改其大小。

相反,您需要为数组创建指针,如下所示:

char **names = new (char*)[numNames];

你的temp路过同样的故事。现在您可以自由删除/ new并分配指针:names = temp

现在,您需要逐行读取文件中的char数据并将其放在“names”数组中。当你读取一个字符串时,你可以在数组成员中为它分配空间,即

names[i] = new char [strlen(inputString) + 1]; // you need '+1' for termination char

您可以在分配后复制字符串中的数据,即

 strcpy(name[i], inputString); // this is a standard 'c' string copy

你也可以使用std::copy或for循环做副本或其他什么。另一种方法是使用标准的'c'malloc函数进行分配:

  name[i] = (char *)malloc(strlen(inputString) + 1);

不同之处在于,当您需要释放内存时,您将在第一种情况下使用delete[] name[i],在第二种情况下使用free(name[i])。虽然看起来你不需要在任务中释放内存。

现在你只需要弄清楚如何从文件中读取。