C指针,指向全局变量:不同的指针

问题描述:

我有一个标头中定义的全局变量/缓冲。我有两个源文件,一个函数库(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

每个编译单元都包含自己的缓冲区,因为你宣布它通过在头部缓冲声明提供关键字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,因为它具有静态存储持续时间。

在这种情况下缓冲将被所有编译单元,其包括报头共享。

static指示编译器实例化一个与当前翻译单元(.c文件加上全部为#include d stuff)的内部链接的变量。内部链接意味着符号(名称)不会被导出。因此,您使用匹配名称的事实是无关紧要的。

所以,在这里,你会得到每一个单独的实例.c文件是#include s表示头。作为独立的对象,他们当然有不同的地址。

如果你想分享一个实例(因此解决)多个课时之中,那么就做平常:

  • 变量声明为extern在头 - 不static。这样做表示它具有外部链接,即在其他地方定义。不要在标题中定义变量。它只能被定义一次,因此...
  • 仅在一个.c文件中定义变量。

关于staticextern基本知识的一些清晰的阅读将使这一切都清楚。

这里的问题是:

我使用创建我缓冲器在报头中:

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 }; 

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个答案增加了什么,除了更具创意的拼写和标点符号之外呢? –