2011-10-21 114 views
1

对我来说,它看起来像它应该是如此简单,但我只是觉得我失去了一些东西。声明在GNU C字符串数组++

我有我的头文件中的私有变量_stoplist当我在头文件中的代码看起来就像这样宣布它。

private: 
    std::string _stoplist[]; 

但是,当后来在我的功能我决定访问这个,它出现segfaults上的任何东西。

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

在具有segfault的std :: string.assign()代码中崩溃。我有一种直觉,我错过了一些明显的东西,但我还没有发现什么。

在此先感谢!

编辑:好,感谢所有帮助。对于任何可能阅读此内容的人,我建议使用下面的答案之一,因为这是做到这一点的明智之举。在我的情况下,因为我需要动态分配它没有使用矢量我只是使用下面的代码。

private: 
    std::string *_stoplist; 

,然后在我的cpp文件

_stoplist = new string[_length]; 

是啊,事实证明,它确实是这样简单,我只是用看的那部分。

+2

我只是想指出,这样的变长数组是不合法的C++,他们是一个GCC扩展。 – bames53

回答

2

你得到一个数组越界错误的,因为_stoplist没有大小。您应该给它一个尺寸,该范围内的唯一通道元素,如:

private: 
    std::string _stoplist[100]; 

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

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

然后,您可以使用其成员函数(如resize())将其扩展为任何需要的大小。

+0

尽可能多的我想使用std :: vector,这是一个类的任务,所以我不被允许。也许我应该在问题中更清楚一点,但我确实需要动态调整大小,这意味着我需要声明它为:'std :: string * _stoplist []',然后使用_stoplist [] =新字符串[_length]'? – Bob

+0

但是,对于任何其他有此问题的人来说,这绝对是正确的答案。 – Bob

+0

@Bob:告诉你的老师他是个白痴,如果可以的话,自己重写一下简化版本的vector。 – GManNickG

1

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