【问题标题】:Declaring a string array in GNU C++在 GNU C++ 中声明一个字符串数组
【发布时间】:2011-10-21 03:33:34
【问题描述】:

对我来说,它似乎应该如此简单,但我只是觉得我错过了一些东西。

我的头文件中有一个私有变量_stoplist 当我在头文件中声明它时,代码看起来就像这样。

private:
    std::string _stoplist[];

但是当我稍后在我的函数中决定访问它时,它会出现任何问题。

_stoplist[_length];
//cout << _length << prints 104 (its a valid int and everything)
_stoplist[0] = "b";

std::string.assign() 代码因段错误而崩溃。我有一种直觉,我在这里遗漏了一些明显的东西,但我还没有完全找到。

提前致谢!

编辑:好的,感谢您的帮助。对于可能阅读本文的其他人,我建议使用以下答案之一,因为这是明智的做法。在我的情况下,因为我需要动态分配它而不使用向量,我只使用了以下代码。

private:
    std::string *_stoplist;

然后在我的 cpp 文件中

_stoplist = new string[_length];

是的,事实证明这真的很简单,而我只是忽略了那部分。

【问题讨论】:

  • 我只是想指出,像这样的可变长度数组不是合法的 C++,它们是 GCC 扩展。

标签: c++ arrays initialization segmentation-fault


【解决方案1】:

由于 _stoplist 没有大小,您会收到数组越界错误。您应该给它一个大小,并且只访问该范围内的元素,例如:

private:
    std::string _stoplist[100];

现在您应该能够通过 _stoplist[99] 索引 _stoplist[0]。然而,更好的解决方案可能会改用 std::vector,因为它更安全。

private:
    std::vector< std::string > _stoplist;

然后您可以使用它的成员函数,例如 resize() 将其增长到您需要的任何大小。

【讨论】:

  • 尽管我很想使用std::vector,但这是一个班级作业,所以我不能这样做。也许我应该更清楚这个问题,但我确实需要动态调整此列表的大小,这是否意味着我需要像这样声明它:std::string *_stoplist[] 然后使用_stoplist[] = new string[_length]
  • 但这绝对是任何其他有此问题的人的正确答案。
  • @Bob:告诉你的老师他是个白痴,然后自己重​​写vector的简化版本,如果可以的话。
  • @GMan:这是与老师建立良好关系的好方法......我会按照要求的方式对作业进行编码,然后提到 std::vector 是一个更好的选择,不要像小孩子一样喊老师的名字。
  • @bstamour:我想很明显我从来没有真正打算让他这样做。
【解决方案2】:

这是因为声明为std::string[] 的变量基本上只是一个指针。要使用它,您需要为其分配内存。如果您想为其分配固定内存,请尝试将其声明为例如std::string _stoplist[5]; 代替。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多