C中的静态变量未初始化为零

时间:2013-12-06 07:23:31

标签: c linux static-variables cross-compiling

我正在为一家公司开展一个大型C项目。

我已经意识到在编译的可执行文件中有些时候,C文件中使用的静态变量没有初始化为零并且在它们中有一些值。 但是当我稍微编辑代码时,比如在项目的任何位置添加print语句,问题就解决了。

我正在使用Broadcom STB mips交叉编译工具链来编译代码。

该程序在运行Linux 3.1.3的Broadcom 97241芯片组上运行。

[编辑]我尝试了一个干净的构建,但问题并没有消失。

3 个答案:

答案 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语句并让问题消失听起来可能是内存损坏问题。您是否正在访问数组越界,溢出堆栈等?