字符串声明中的堆栈溢出

时间:2012-05-24 10:47:58

标签: c++ visual-c++

  

可能重复:
  Very large array on the heap (Visual C++)

我需要声明10个长度为100000个字符的字符串。

int main(void)
{
long t;
cin>>t;
string str[10][100000];
for(long i=0;i<=t;i++)
{
       getline(cin,str[i][100000]);
}

for(long i=1;i<=t;i++)
{
  getStringSize(str[i][100000]);
}
system("PAUSE");
}

我在VC ++中编写代码但是只要我编译代码就会有堆栈溢出。 如果我将字符串的大小保持为str [10] [10000]那么代码效果很好。我需要对代码工作做些什么?

4 个答案:

答案 0 :(得分:4)

这不是你如何声明每个10,000个字符的10个字符串 - 你声明了一个2D字符串数组,10x10000。

如果您希望每个字符串都包含10,000个字符,那么就按C ++方式执行此操作:

vector<string> str(10, string(100000, ' '));

请注意,您需要指定要重复10,000次的字符。由于std::string旨在动态增长,因此您可以完全跳过10,000个部分:库将根据需要分配尽可能多的内存。

vector<string> str(10);

您也可以在C ++ 11中使用array

答案 1 :(得分:2)

您需要动态分配内存:您的情况下的堆栈不足以容纳那么多数据

const size_t len = 10;
string* str[len]; 
for(long i=0; i<len; ++i) {
  str[i] = new string[100000];
} 

注意:不要忘记在不再需要时删除已分配的内存。

注意:为了让生活更轻松,请使用适合自己进行内存管理的容器(例如vector<>

更新:您的代码也存在其他一些问题:

for(long i=0;i<=t;i++) // t could be lager than 9
{ 
  getline(cin,str[i][100000]); // you are accessing a non-existent element
} 

尝试改为:

long t;   
cin>>t;   
vector<string> str; // declare an auto-resizing container of strings   

for(long i=0; i<t; i++)
{ 
  string tmp; // this string will be able to store a lot of characters by itself
  getline(cin, tmp); // read in the next line
  str.push_back(tmp); // add the line to our container
} 

for(long i=0; i<t; i++)
{
  // do something with str[i] // values str[0]..str[t-1] are guaranteed to be valid
}

答案 2 :(得分:0)

您需要在堆中分配内存。像这样......

string *str[10];

for(int i = 0; i < 10; i++)
  str[i] = new string[100000];

答案 3 :(得分:0)

如果你使用std :: string那么它不是固定的长度 - 这就是重点。你可能想要的是:

char str[10][100000];

这会给你10 x char [100000]。就目前而言,你有一个10 x 100000字符串的矩阵。