运行时错误(堆栈溢出)

时间:2013-09-07 18:10:38

标签: c stack-overflow

我用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

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

2 个答案:

答案 0 :(得分:9)

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

-----------------
|  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它分配内存本身并返回指针,这里再没有问题。只是不要忘记在使用它之后将其释放,因为这又会造成内存泄漏。

答案 1 :(得分:0)

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

相关问题