动态分配字符串数组

时间:2013-10-17 07:07:45

标签: c++ arrays string memory-management dynamic

当我尝试运行此代码时,它会崩溃。没有错误消息。当程序编译并运行时,它只显示Windows 7消息,“此程序已停止工作。”:

void readGameFile(string ** entries, int * num_entries, string ** story, int * num_lines)
{
    ifstream madlib("madlibs1.txt");
    string line;
    getline(madlib, line);
    *num_entries=stoi(line);
    *entries=new string [*num_entries];
    for (int i=0; i<*num_entries; i++)
    {
        getline(madlib,*entries[i]);
    }

我做了一些测试,似乎为entries[0]分配了一个值,然后在尝试为entries[1]赋值时崩溃了。我被迫使用这个函数名,特别是那些函数参数和参数类型。我也可能不会使用我见过的malloc,vector或其他答案。

1 个答案:

答案 0 :(得分:1)

我认为这个问题是优先考虑的问题:你几乎可以肯定 想:

getline( madlib, (*entries)[i]) );

否则,您将从string**编入索引 解除引用:*(entries[i])

您还想检查getline的结果,可能在。{ 循环:

for ( int i = 0; madlib && i != *num_entries; ++ i )...

以及std::stoi之前。

最后:我不知道为什么你被迫使用它 功能签名。它是可怕的C ++,你永远不应该 写这样的东西。逻辑上,std::vector<string> 将是一个更好的解决方案,但即使没有它:你的功能 有4个参数。通过返回可以更好地处理 一个struct。如果失败了,那么C ++中的参数就是 通常由非const引用实现,而不是由指针实现。 虽然在某些情况下有使用指针的参数, 当它导致指向指针时,它是邪恶的。如果 没别的:

bool        //  Because we have to indicate whether it succeed or failed
readGameFile( std::string* &entries, int &num_entries, std::string* &story, int &num_lines )
//  ...

(这看起来更像它应该是构造函数, 但是,有两个数据元素的类entriesstory。)