运行时错误(堆栈溢出)运行时错误(堆栈溢出)(runtime error (stack overfl

2019-05-12 12:05发布

我有在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";
}
...

正如PROGRAMM了这一点:

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

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

word1 number1
word2 number2

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

Answer 1:

好了......所以我想会有人能解答你的堆栈溢出的问题,但到目前为止,大家只提到你确实有(更多关于这个版本)是无关的堆栈溢出(这将是有问题的,但只是一旦出了问题你解决这个问题在前)。

-----------------
|  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函数调用指向一个字符数组(这里的问题),并在列K(没问题的int。所以现在所有的选项阵列点的条目无处/任何地方。你必须要分配给他们的内存(再次使用malloc )。

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



Answer 2:

字符*选项[100000]分配100000个字符串指针,而不是字符串。 scanf函数被传递胡言乱语。



文章来源: runtime error (stack overflow)