我有一个需要不同类型迭代的项目。一个是5000的char数组上的函数递归。在50次调用之后它将崩溃,假设从堆栈溢出。不知道怎么解决这个问题。
void functionLoop(int loopInt)
{
#ifdef ___EXSTR_H___
#undef ___EXSTR_H___
#endif
#include "exstr.h"
ofstream fout;
fout.open("output.txt");
int arrayLength = sizeof ( example_strings ) / 4; // arrayLength = 5000.
char *stringArray = example_strings[loopInt];
int charCount = 0;
while( *stringArray != 0 )
{
stringArray++;
charCount++;
}
cout << loopInt + 1 << ": " << charCount << ": " << example_strings[loopInt] << endl;
loopInt++;
if(loopInt < arrayLength)
{
functionLoop(loopInt);
}
}
编辑:
我清理了很多代码,删除了所有变量,将头文件移动到参数,并获得了大约4500次迭代,但是在4546之后它仍然崩溃。这是更新后的代码:
void functionLoop(char * example_strings[], ofstream &outputFile, int counter)
{
outputFile << counter + 1 << ": " << strlen(example_strings[counter]) << ": " << example_strings[counter] << endl;
counter++;
if(counter < ARRAY_SIZE)
{
functionLoop(example_strings, outputFile, counter);
}
}
感谢所有帮助过的人。
答案 0 :(得分:1)
以下是我在代码中可以看到的一系列问题。
1)头文件包含在函数内部,所以如果你的头文件中有一些变量/数组声明,(我猜你的example_strings在那个头文件中),它将成为你函数的局部变量实例,并且将占用堆栈空间。随着递归的继续,很快就会导致Stack OverFlow。
2)为什么要在每次递归调用时打开文件“output.txt”?因此,在每次通话中,您都会一次又一次地打开相同的故障。将它移到某个地方只打开一次。
所以,这是我的建议(简要):
1)将标题#include "exstr.h"
移出您的功能。
2)不要在每次递归调用时打开相同的文件。
答案 1 :(得分:0)
如果由于递归导致你的堆栈用完,则删除递归调用并使用迭代方法。很容易改变你的代码来做到这一点。在loopInt上做一个while / for循环,并检查数组[loopInt]的字符串长度。
提示
您可以使用strlen
来查找字符串的长度,您不需要手动执行该循环:while(* stringArray!= 0)
伪代码:
i=loopInt
while i<arrayLength {
print strlen(exampleString[i], exampleString[i])
}
请编辑我的帖子。我在平板电脑上。
答案 2 :(得分:0)
尝试:
void functionLoop(int loopInt)
{
#ifdef ___EXSTR_H___
#undef ___EXSTR_H___
#endif
#include "exstr.h"
ofstream fout;
fout.open("output.txt");
int arrayLength = sizeof ( example_strings ) / 4; // arrayLength = 5000.
while (loopInt < arrayLength)
{
char *stringArray = example_strings[loopInt];
int charCount = strlen(stringArray);
stringArray += charCount;
cout << loopInt + 1 << ": " << charCount << ": " << example_strings[loopInt] << endl;
loopInt++;
}
}
答案 3 :(得分:0)
将数组作为参数传递给函数,即
printLoop(outputFile, example_strings, current_index, max_index);