C語言 強行給記憶體位址賦值

2021-10-23 05:37:08 字數 851 閱讀 3738

最近看stm32**,有這樣一段話不理解

#define gpioa ((gpio_typedef *) gpioa_base)

然後我就思考了下,不就是定義乙個巨集,然後宣告乙個結構體變數,進行賦值麼?

然後我隨便定義了乙個位址,強制轉換成乙個結構體指標型別,**如下:

typedef struct

student;

#define a ((student *) 0x12345678)

int main(int argc, char ar**)

執行時,程式直接崩潰。然後查閱經典資料,《c和指標》

劃線部分大致意思,在乙個未知的位址,強行賦值,可能會改變程式本身某一部分的記憶體段,導致崩潰。

隨後,我隨便定義了乙個結構體型別的變數,然後讀出其記憶體位址。可以執行。**如下:

typedef struct

student;

define a ((student *) 0x12345678)

int main(int argc, char ar**)

其中,0x12ff40是我定義test後,取得到的記憶體位址。這樣a指標就有了實際意義。

再反過來看stm32的io定義

#define gpioa ((gpio_typedef *) gpioa_base)

再引用經典《c和指標》,gpioa,並不是用於訪問某個變數,而是訪問硬體本身。

這就意味著,如果使用gpioa中的內容,那麼就相當於改io配置。換句話說,通過記憶體,建立起了io與程式設計師的互動通道。

用C語言給指定的記憶體位址賦值(通過指標)

這兩天找工作,做面試題的時候,碰到這樣的題 指定了乙個位址,比如說0x0012ff7c這樣乙個位址,要求是給這個指定的位址賦乙個確定的值,比如說100,當時就是乙個鬱悶啊,在彙編裡這樣用過,在c中還真沒用過。今天在網上查了查,自己也在turbo c上執行了一下,正好做個總結,方法如下 char te...

C語言記憶體位址

任務清單 c語言在記憶體中一共分為5個區域 記憶體棧區 存放區域性變數名 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,函式呼叫結束後釋放記憶體空間。通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,用於在函式作用域內建立,在離開作用域後自動銷毀的變數的儲存區。通常是區域性變數,函...

C語言記憶體位址基礎(ZZ)

從計算機記憶體的角度思考c語言中的一切東東,是挺有幫助的。我們可以把計算機記憶體想象成乙個位元組陣列,記憶體中每乙個位址表示 1 位元組。比方說我們的電腦有 4k 記憶體,那這個記憶體陣列將會有 4096 個元素。當我們談論乙個儲存位址的指標時,就當相於我們在談論乙個儲存著該記憶體陣列某個元素索引的...