局部变量和全局变量

时间:2014-03-07 20:13:55

标签: c function

当我运行程序时,会出现错误:

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中初始化为局部变量时,为什么程序不起作用?

4 个答案:

答案 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次之后它可以安全地退出。