-3

可能重复:
堆上非常大的数组(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

4 回答 4

4

这不是您声明十个字符串的方式,每个字符串包含 10,000 个字符 - 您声明了一个 2D 字符串数组,10x10000。

如果您希望每个字符串有 10,000 个字符,这就是您使用 C++ 的方式:

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

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

vector<string> str(10);

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

于 2012-05-24T10:55:04.800 回答
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
}
于 2012-05-24T10:50:08.907 回答
0

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

string *str[10];

for(int i = 0; i < 10; i++)
  str[i] = new string[100000];
于 2012-05-24T10:51:14.793 回答
0

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

char str[10][100000];

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

于 2012-05-24T10:53:06.993 回答