【问题标题】:C: static int gets strange valueC: static int 得到奇怪的值
【发布时间】:2013-11-16 06:30:02
【问题描述】:

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

【问题讨论】:

  • 请贴出代码。
  • 你的变量应该在 .C 文件中,而不是在头文件中(你应该把它的定义标记为“extern”)。
  • 变量不在头文件中,在c文件中。而且它只在那个文件中使用。
  • 通过在标头中设置变量静态,您将为包含标头的每个文件提供其自己的变量个人版本。在一个文件中设置变量不会影响任何其他文件中的版本
  • xcode 会撒谎吗?尝试将值打印出来

标签: c variables static int


【解决方案1】:

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

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

现在,如果您在标头中定义静态变量,则包含该标头的每个编译单元都将拥有自己的该名称的变量。因此,您的程序充满了许多同名变量,每个变量都特定于它所在的编译单元。

我认为您真正想要的是一个非静态的 extern 声明在标头中,而正是 一个 编译单元实际定义了变量。

【讨论】:

  • 变量在 c 文件中,通过它的头文件包含。该变量仅在 c 文件中使用。
  • @user1121487:你写的把变量放在头文件中。那么它是什么?您如何将源代码添加到答案中,以便我们可以看到您实际拥有的内容。无论如何,在头文件中拥有全局范围 static 声明或定义是没有意义的。
  • 不,我没有,我说它在包含文件的顶部。抱歉不清楚,我只是说如果在外部 c 文件中而不是在主文件中。
【解决方案2】:

我认为您超出了您的人员数组

其中一个 strcpy 函数超出了 person 对象中的缓冲区边界,并覆盖了 head 变量。我猜 tail 和 nbr_elem 也会去。

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

【讨论】:

  • 这怎么可能?仅通过增加 +1 或设置为零来更改头部值。并且该错误仅在使用 static 关键字时发生....
  • 如果超出 person 数组定义的区域,可以更改 head 值。如果没有静态,编译器可能会将变量放在其他地方。在 head 之前添加一个静态变量,将其设置为 0,然后查看是否也更改了。或者只是将 char[] 缓冲区更改为 std::strings,这无论如何都是个好主意
  • @user1121487 除非你不能使用 std 如果这是 C,但你仍然应该通过首先检查数据的长度或使用 strncpy 来防止 strcpys 写入过多的数据
【解决方案3】:

如果您在文件A.c 中声明了一个全局静态变量,则意味着该变量仅在此A.c 文件的范围内可用。见:http://en.wikipedia.org/wiki/Static_variable

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

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

【讨论】:

    【解决方案4】:

    您在调用 strcpy 时没有检查您尝试写入的值是否真正适合 person 结构内分配的空间。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2017-04-23
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多