我用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";
}
...
Run Code Online (Sandbox Code Playgroud)
就像程序到达这一点一样:
scanf("%s%d",&options[i],&k[i]);
Run Code Online (Sandbox Code Playgroud)
我得到运行时错误(堆栈溢出).这里的输入应该是这样的:
word1 number1
word2 number2
Run Code Online (Sandbox Code Playgroud)
等等.我不知道为什么会这样.有什么问题?
好的...所以我认为有人会为你的堆栈溢出问题提供一个答案,但到目前为止,每个人都只提到了你实际上遇到的问题(后面有更多内容)与堆栈溢出无关(它会有问题但只有一次你先解决这个问题.
-----------------
| Your stack |
| (grows down) |
| |
-----------------
| |
| |
| |
| |
| |
| | -- max stack size is here
| |
| |
| |
| |
| |
-----------------
| Your heap |
| (grows up) |
| |
-----------------
Run Code Online (Sandbox Code Playgroud)
然后你尝试分配一堆非常大的数组并耗尽空间
-----------------
| Your stack |
| (grows down) |
| |
| |
| |
| |
| |
| |
| |
| | -- max stack size is here
| |
----------------- -- what you actually need
| |
| |
| |
| |
-----------------
| Your heap |
| (grows up) |
| |
-----------------
Run Code Online (Sandbox Code Playgroud)
所以你得到一个运行时错误(堆栈溢出),因为你试图使用比你可用的更多的堆栈空间.
这里的技巧是使用堆分配(因为在大多数平台上,至少是我所听到的所有平台),堆大大超过堆栈.
在你使用的堆上分配内存malloc(同样,当你完成它时,不要忘记使用释放内存free,否则你将泄漏内存).
编辑:奖金:你有另一个问题.其他答案似乎表明您正在访问/解除引用/使用未分配的内存.在这一点上你真的很好.
你scanf调用点到char数组(这是问题)和数组k中的int(没问题.所以现在,options数组中的所有条目都指向无处/任何地方.你需要为它们分配内存(再次使用)malloc).
至于strdup它分配内存本身并返回指针,这里再没有问题.只是不要忘记在使用它之后释放它,因为这将是内存泄漏.