当我运行程序时,会出现错误:
Segmentation fault
这是代码:
#include <stdio.h>
void
add (int sum)
{
int count = 1;
sum = sum + count;
count++;
if (count <= 4)
{
add (sum);
}
else
{
printf ("sum=%d\n", sum);
}
}
int
main ()
{
int sum = 0;
add (sum);
return 0;
}
当我将count
从局部变量更改为全局变量时,程序可以正常工作。当变量count
在函数add
中初始化为局部变量时,为什么程序不起作用?
答案 0 :(得分:3)
如果count
是全局变量,则只有在程序运行时才会将其初始化为1。
如果count
是局部变量,而不是static
,则每次输入add()
时,它都会初始化为1。为防止这种情况,请将其声明为
static int count = 1;
其他答案没有告诉你,为什么你会得到segmentation fault
。这样做的原因是,如果您始终将count
初始化为1,则始终会在add()
内调用add()
。每次执行此操作都会占用堆栈空间,直到堆栈耗尽并尝试覆盖堆栈外的任何内容。 那是给你分段错误的原因。从技术上讲,这称为 Stack Overflow ,因此称为此站点的名称。
答案 1 :(得分:1)
现在,您有一个本地变量count
,只要您输入函数add()
,它就会将count
设置为1.您的代码正在递增count
然后检查到看它是否小于或等于4,如果不是,它再次调用add()
。这将永远循环,因为2总是小于4。
您需要将变量作为本地static int
或全局变量。在这两种情况下,您都将它初始化为1,它将保留最后一个值集。我会在这里使用static int
而不是全局...总的来说,如果没有充分的理由使用它们,那么全局变量被认为是不好的做法。
答案 2 :(得分:1)
当您的方法 add(int sum)已执行时,计数将始终再次获得值。
因此,这将导致无休止的递归并最终导致段错误。
答案 3 :(得分:0)
如果在方法中将count
初始化为局部变量,则会创建一个永不结束的递归。每次进入函数count
'重置'为1.它将永远不会达到离开函数所需的值。
当您创建count
作为全局变量时,它只被分配1次,并且每次执行该函数时它都会增加1,因此在4次之后它可以安全地退出。