我正在为一家公司开展一个大型C项目。
我已经意识到在编译的可执行文件中有些时候,C文件中使用的静态变量没有初始化为零并且在它们中有一些值。 但是当我稍微编辑代码时,比如在项目的任何位置添加print语句,问题就解决了。
我正在使用Broadcom STB mips交叉编译工具链来编译代码。
该程序在运行Linux 3.1.3的Broadcom 97241芯片组上运行。
[编辑]我尝试了一个干净的构建,但问题并没有消失。
答案 0 :(得分:2)
C标准要求必须在程序开始时初始化static
个变量。如果你没有初始化它们,那么编译器会将它们初始化为0.因此,如果你使用的是普通的编译器,那么如果你没有明确地初始化它们,那么你的所有static
变量都被初始化为0。如果出现以下问题:
1)您的一些代码将值设置为静态变量。
2)编译器不是C
编译器。
3)你的程序损坏了内存,然后就printf()
,e.t.c。
反正。尝试显式地将静态变量初始化为0。 (削减2分)。并希望有一种方法来调试您的应用程序。调试器在这些问题中更有用,然后在这里提出这样的抽象问题。
答案 1 :(得分:1)
如前所述,编译器将静态变量设置为0。如果你看到一些不同的行为,你的代码最有可能在某个地方破坏它(即数组溢出或类似)。
为了跟踪这个问题,您应该在main
上设置断点并验证变量是否确实为0.如果不是,那将是编译器错误。
如果变量为0,则在其上设置内存访问断点,您应该看到它在哪里破坏它。
在没有看到代码的情况下,在这里提问真的没有用,因为任何答案都只是猜测,所以我们只能提供通用的答案。
答案 2 :(得分:0)
声明为static的变量应该初始化为0,因为bss应该在启动时初始化为0.
添加printf语句并让问题消失听起来可能是内存损坏问题。您是否正在访问数组越界,溢出堆栈等?