2016-07-26 184 views
-1

我有一個標頭中定義的全局變量/緩衝。我有兩個源文件,一個函數庫(lib.c)和一個測試平臺(tb.c),都包含頭文件。C指針,指向全局變量:不同的指針

在庫中,我填充全局變量緩衝區,打印指針值並通過迭代指針,即[1,2,3,4,5等],用指針打印u8緩衝區的一些條目0xC8004C58(緩衝區長度= 2144)。

現在在測試平臺上,我以同樣的方式抓取一個指向這個同樣的全局u8緩衝區的指針,正好是。現在我的解釋是全局變量保持在同一個地方,所以指向它的開始的指針應該是相同的,但是我得到的指針是0xC80054D8。顯然,當指針現在不同時,返回的數據是[0,0,0,0,0等]。

所以: 如果u8緩衝區保持在同一個位置並且是全局定義的,爲什麼指向這個緩衝區的指針會根據我在lib.c或tb.c中而有所不同?

我使用的報頭創建我的緩衝區:

static u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS] = { 0 }; 

我用我創建的指針在lib.c文件:

u32 *RxBufferPtr_Data = RxBuffer_Data; 

我創建我的指針tb.c文件使用:L u32 * RxBufferPtr_Data = RxBuffer_Data;或& RxBuffer_Data。兩者都返回相同的值,並且兩者都不等於在lib.c文件中正確輸出緩衝區數據的指針。

+0

根本不使用全局變量。只需將它封裝到帶訪問器/等的單個模塊中即可。功能。 – Olaf

回答

2

每個編譯單元都包含自己的緩衝區,因爲你宣佈它通過在頭部緩衝聲明提供關鍵字static有內在聯繫。

你應該聲明它的頭就像

extern u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS]; 

,並在某些模塊,因爲在任何情況下將它定義成

u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS] = { 0 }; 

或者僅僅是想

u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS]; 

沒有初始化編譯器會將它初始化爲0,因爲它具有靜態存儲持續時間。

在這種情況下緩衝將被所有編譯單元,其包括報頭共享。

4

static指示編譯器實例化一個與當前翻譯單元(.c文件加上全部爲#include d stuff)的內部鏈接的變量。內部鏈接意味着符號(名稱)不會被導出。因此,您使用匹配名稱的事實是無關緊要的。

所以,在這裏,你會得到每一個單獨的實例.c文件是#include s表示頭。作爲獨立的對象,他們當然有不同的地址。

如果你想分享一個實例(因此解決)多個課時之中,那麼就做平常:

  • 變量聲明爲extern在頭 - 不static。這樣做表示它具有外部鏈接,即在其他地方定義。不要在標題中定義變量。它只能被定義一次,因此...
  • 僅在一個.c文件中定義變量。

關於staticextern基本知識的一些清晰的閱讀將使這一切都清楚。

1

這裏的問題是:

我使用創建我緩衝器在報頭中:

static u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS] = { 0 }; 

上面創建的變量的每一個C文件的單獨副本從中標題包含在內。換句話說,來自單獨模塊的可能全局變量對鏈接器是不可見的,這使得它們彼此不相關,並給它們分開的地址。

如果你想使一個全局變量,其聲明中這樣

extern u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS]; 

頭,然後在文件中包含你main()功能像這樣定義它:

u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS] = { 0 }; 
1
static u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS] = { 0 }; 

你在頭文件中定義了RxBuffer_Datastatic,它告訴編譯器你只是在這個文件中使用這個變量。當lib.c包含y我們的頭文件,它在lib.c中定義。並且RxBuffer_Data將在tb.c包含頭文件時重新定義,這個RxBuffer_Data是一個新變量。因此,您可以找到兩個指針RxBuffer_Data不同。


如果要定義全局varibal,您可以在lib.c定義它:

u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS] = { 0 }; 

,並在你的頭文件中聲明:

extern u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS]; 

順便說一句,不要在頭文件中定義全局變量,因爲一旦包含了這個頭文件,就會重新定義它。

+0

對不起,但是這比20分鐘前的其他3個答案增加了什麼,除了更具創意的拼寫和標點符號之外呢? –