2015-12-15 91 views
0

我想一個地址值賦給一個指針,但我得到這個warning如何爲指針指定常量?

#define PRODUCT_NUMBER_ADDR 0x12345 

"foo\foo.c", line 1444: cc1967: {D} warning: "long *" pointer set to 
      literal value - volatile needed? 
       ram_address = (long*) (PRODUCT_NUMBER_ADDR); 
            ^

如何正確我我的地址分配給我的指針?

+3

編譯器很可能會警告你,'ram_address'不是易失性的,當讀取硬件本身更新的RAM地址時,通常需要這樣做(這通常是將指針指向文字地址時所要做的)。無論如何,這只是一個警告;該代碼仍然應該編譯。 –

+1

如果你提供一個最簡單的工作例子,這個問題會更有用。儘管有些人在猜測你的代碼是基於顯示的錯誤消息的時候非常成功,但對於未來的讀者來說,看看問題中的實際代碼會更有用。 – 5gon12eder

+0

如果你有硬件寄存器,使用內置類型是一個壞主意。使用'stdint.h'類型,例如而不是uint32_t'(強烈推薦未簽名的版本)。 – Olaf

回答

4

變化:

ram_address = (long*) (PRODUCT_NUMBER_ADDR); 

ram_address = (volatile long*) (PRODUCT_NUMBER_ADDR); 

同時確保ram_address被聲明爲volatile long *。在這裏使用volatile告訴編譯器,內存對象的值可能會意外地改變,所以編譯器不應該做任何緩存假設。