【问题标题】:runtime error (stack overflow)运行时错误(堆栈溢出)
【发布时间】:2013-09-11 15:39:21
【问题描述】:

我有这段 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

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

【问题讨论】:

  • 您的数组大于堆栈上的可用内存量。因此 stack 溢出。您需要堆分配它们。如果这是 C++,请使用 std::vector。如果不是删除 C++ 标签。
  • @GrijeshChauhan 为什么会有帮助?
  • 除了堆栈问题之外,当您尝试写入 options[n] 和 param[n] 时,您还尝试写入取消引用的未初始化指针,因为您从未为这些指针的字符串提供任何空间指向。

标签: c stack-overflow


【解决方案1】:

char *options[100000] 分配 100000 个字符串指针,而不是字符串。 scanf 被传递给胡言乱语。

【讨论】:

  • 我已经更改了,但仍然不断收到堆栈溢出错误。
【解决方案2】:

好的...所以我认为有人会为您的堆栈溢出问题提供答案,但到目前为止,每个人都只提到了您实际遇到的一个与堆栈溢出无关的问题(稍后会详细介绍)(这将是有问题的但只有在您先解决此问题后)。

-----------------
|  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 (没问题。所以现在选项数组中的所有条目都指向无处/无处。您需要为它们分配内存(再次使用malloc)。

至于strdup,它自己分配内存并返回指针,这里也没有问题。只是不要忘记在使用完后释放它,因为这又会导致内存泄漏。

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 2021-05-28
    • 1970-01-01
    • 2010-09-10
    • 2014-01-26
    • 2019-02-16
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多