簡體   English   中英

C中的靜態變量未初始化為零

[英]Static variables in C not initialized to zero

我正在為一家公司做一個大型的C項目。

我已經意識到在編譯的可執行文件中有些時候,C文件中使用的靜態變量沒有初始化為零並且在它們中有一些值。 但是當我稍微編輯代碼時,比如在項目的任何位置添加print語句,問題就解決了。

我正在使用Broadcom STB mips交叉編譯工具鏈來編譯代碼。

該程序在運行Linux 3.1.3的Broadcom 97241芯片組上運行。

[編輯]我嘗試了一個干凈的構建,但問題並沒有消失。

C標准要求必須在程序開始時初始化static變量。 如果你沒有初始化它們,那么編譯器會將它們初始化為0.因此,如果你使用的是普通的編譯器,那么如果你沒有顯式地初始化它們,那么所有的static變量都被初始化為0。 如果出現以下問題:

1)您的一些代碼將值設置為靜態變量。

2)編譯器不是C編譯器。

3)你的程序損壞了內存,然后你就不能依賴於printf()等的斷言

無論如何。 嘗試顯式地將靜態變量初始化為0。 (削減2分)。 並希望有一種方法來調試您的應用程序。 調試器在這些問題中更有用,然后在這里提出這樣的抽象問題。

如前所述,編譯器將靜態變量設置為0。 如果你看到一些不同的行為,那么你的代碼最可能在某個地方破壞它(即數組溢出或類似)。

為了跟蹤這個問題,你應該在main上設置一個斷點並驗證變量是否確實為0.如果不是,那將是一個編譯器錯誤。

如果變量為0,則在其上設置內存訪問斷點,您應該看到它在哪里破壞它。

如果沒有看到代碼,那么在這里提問真的沒有用,因為任何答案都只是猜測,所以我們只能提供通用的答案。

聲明為static的變量應該初始化為0,因為bss應該在啟動時初始化為0。

添加printf語句並使問題消失聽起來可能是內存損壞問題。 您是否正在訪問數組越界,溢出堆棧等?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM