C:static int得到奇怪的值

时间:2013-11-05 11:34:20

标签: c variables static int

(从原始问题更改变量名称以适合实际代码) 我是C的新手,我正在实施一个队列。 错误与static int head=0变量有关。每次调用dequeue()时它都会增加1。当队列出队并调用函数get_person()时,似乎发生错误。然后头变量似乎得到一个高随机数,如 23423449 。我不知道这是从哪里来的。但是,如果我删除“static”关键字,因此变量声明为int head=0,它可以正常工作。怎么会?

4 个答案:

答案 0 :(得分:5)

  

包含的文件顶部使用“全局”变量:static int variable1=0

这清楚地表明,您不了解static关键字在全局范围内的含义。在全局范围内,在函数外部,静态意味着变量仅对编译单元中的代码可见,变量已在其中定义。

现在,如果在标头中定义静态变量,则包含该标头的每个编译单元将具有该名称的自己的变量。所以你的程序中充斥着许多同名的变量,每个变量都特定于它所在的编译单元。

我认为你真正想要的是标题中的非静态extern声明,以及一个编译单元实际定义变量。

答案 1 :(得分:1)

我认为你超越了你的人物阵列

其中一个strcpy函数超出了person对象中缓冲区的范围,并覆盖了head变量。我猜是尾巴和nbr_elem也是如此。

您应该检查您复制的字符数是否超过缓冲区长度,或使用strncpy。

答案 2 :(得分:0)

如果在文件A.c中声明全局静态变量,则表示此变量仅在此A.c文件的范围内可用。请参阅:http://en.wikipedia.org/wiki/Static_variable

由于您还没有发布任何代码,并且您在不同的文件中使用相同的变量(例如B.c),似乎它正在调用undefined behavior,这解释了程序正在打印的随机数。

如果您希望在其他.c文件中使用该变量,则不应将其设置为静态。

答案 3 :(得分:0)

您正在调用strcpy而不检查您尝试编写的值是否实际适合person结构内的已分配空间。

最有可能发生的事情是你写的超出了分配的内存,你的strcpy实际上覆盖了head的值。 strcpy将继续写入,直到它遇到空终止符('\ 0')。

如果你在valgrind(在大型程序中找到这种类型的问题的有用工具)中运行它,它可能会告诉你发生了无效的写入。

C假设您知道自己在做什么,只要您可以随意访问可以使用它的内存:)