运行时错误(堆栈溢出)

我用C语言编写了这段代码:

char *options[100000]; int k[100000]; char *param[100000]; int n; int i,j; ... scanf("%d",&n); for (i=0;i<n;i++) { scanf("%s%d",&options[i],&k[i]); param[i]="On"; } ... 

就像程序到达这一点一样:

 scanf("%s%d",&options[i],&k[i]); 

我得到运行时错误(堆栈溢出)。 这里的输入应该是这样的:

 word1 number1 word2 number2 

等等。 我不知道为什么会这样。 有什么问题?

好的……所以我认为有人会提供你的堆栈溢出问题的答案,但到目前为止,每个人都只提到了你实际上遇到的问题(后面会有更多关于堆栈溢出的问题)(它会有问题但只有一次你先解决这个问题。

 ----------------- | Your stack | | (grows down) | | | ----------------- | | | | | | | | | | | | -- max stack size is here | | | | | | | | | | ----------------- | Your heap | | (grows up) | | | ----------------- 

然后你尝试分配一堆非常大的数组并耗尽空间

 ----------------- | Your stack | | (grows down) | | | | | | | | | | | | | | | | | -- max stack size is here | | ----------------- -- what you actually need | | | | | | | | ----------------- | Your heap | | (grows up) | | | ----------------- 

所以你得到一个运行时错误(堆栈溢出),因为你试图使用比你可用的更多的堆栈空间。

这里的诀窍是使用堆分配(因为在大多数平台上,至少是我所听到的所有平台),堆大大超过堆栈。

要在堆上分配内存,你使用malloc (同样,当你完成它时,不要忘记使用free释放内存,否则你会泄漏内存)。

编辑:奖金:你有另一个问题。 其他答案似乎表明您正在访问/取消引用/使用未分配的内存。 在这一点上你真的很好。

你scanf调用指向一个char数组(这里是问题)和数组k中的一个int(没问题。所以现在,options数组中的所有条目都指向无处/任何地方。你需要为它们分配内存(再次使用) malloc )。

至于strdup它分配内存本身并返回指针,这里再没问题。 只是不要忘记在使用它之后将其释放,因为这将是内存泄漏。

char * options [100000]分配100000个字符串指针,而不是字符串。 scanf正在传递乱码。