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

C中的静态变量未初始化为零,c,linux,static-variables,cross-compiling,C,Linux,Static Variables,Cross Compiling,我正在为一家公司做一个大型C项目 我已经意识到,在编译的可执行文件中,C文件中使用的静态变量有时没有初始化为零,而是有一些值。 但当我稍微编辑代码时,就像在项目中的任何位置添加打印语句一样,问题就解决了 我正在使用Broadcom STB mips交叉编译器工具链来编译代码 该程序在运行Linux 3.1.3的Broadcom 97241芯片组上运行 [编辑]我也尝试了一个干净的构建,但问题没有消失。C标准要求必须在程序开始时初始化静态变量。如果不初始化它们,则编译器会将它们初始化为0。所以,如

我正在为一家公司做一个大型C项目

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

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

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


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

C标准要求必须在程序开始时初始化
静态变量。如果不初始化它们,则编译器会将它们初始化为0。所以,如果您使用的是普通编译器,那么如果您不显式地初始化它们,那么所有的
静态
变量都将初始化为0。如果出现以下情况,则可能出现此类问题:

1) 您的一些代码将该值设置为静态变量

2) 编译器不是
C
编译器

3) 您的程序会损坏内存,因此您不能依赖于
printf()
,e.t.c.上的断言


无论如何。尝试将静态变量显式初始化为0。(将2点截断)。希望有一种调试应用程序的方法。调试器在此类问题中比在此处提出此类抽象问题更有用。

声明为静态的变量应初始化为0,因为bss应在启动时初始化为0


添加printf语句并解决问题听起来可能是内存损坏问题。您是否访问了超出边界的数组、堆栈溢出等?

如前所述,编译器将静态变量设置为0。如果您看到一些不同的行为,最有可能是您的代码在某个地方损坏了它(即数组溢出或类似)

为了跟踪此问题,您应该在
main
上设置一个断点,并验证变量是否确实为0。否则,这将是一个编译器错误

如果变量为0,则在其上设置一个内存访问断点,您应该可以看到损坏它的位置


在没有看到代码的情况下,在这里提问是没有帮助的,因为任何答案都只是猜测,因此,我们只能提供一般答案。

您如何知道变量未初始化为零?@Xymostech我添加了if语句和assert语句,以检查代码中是否初始化为零。您确定所有依赖项对构建过程都是明显的吗?如果观察到这些“错误”初始化的
static
变量,请尝试执行完整的重新构建,然后重新检查(无需修改代码)。@alk我确实执行了一个干净的构建来验证,但问题仍然存在。@cyphar这些是保存在中的静态变量。bss和C标准声明这些变量是在程序启动时初始化的。