遇見一道題:
int a[3] = ;
int *p = (int*)(&a+1);
printf("%d, %d", *(a+1), *(p-1));
以為*p-1應該輸出為1,但跑過程式才發現輸出為3
然後就debug了一下,經過若干除錯,發現規律如下:
a作為陣列的指標,其值為該陣列記憶體的起始位址,而在debug中,&a的值與a相同。但若對a與&a進行加減法運算時,則發現,a+1與&a+1對1的理解不同。
a+1將a看作是乙個指標,而指標的大小在32位系統中為4位元組(32位),所以結果為a的值加上4;
&a+1將a所指向的位址空間看作乙個整體,而此處a指向乙個12位元組的記憶體空間(sizeof(a) == 12),所以結果為a的值加上12;
但不敢確定,望各位大神指正!
指標 指標變數與記憶體空間 解惑
指標 指標變數與記憶體空間 解惑 一年前,我曾今在chinaunix寫過一篇部落格 關於定義乙個指標與指標變數 然後搬家來了csdn。這篇部落格中寫道了很多關於指標和指標變數以及空間分配的一些常見錯誤。但是,到現在為止,無論是csdn的還是一些已經工作的同事以及大三大四的學生,陸陸續續的有人在問我關...
記憶體空間與分配
1 記憶體分配錯誤 動態記憶體分配錯誤有兩種基本型別 記憶體錯誤和記憶體洩漏。1 記憶體錯誤 當乙個指標或者該指標所指向的記憶體單元成為無效單元,或者記憶體中分配的資料結構被破壞時,就會造成記憶體錯誤。指標未被初始化,指標被初始化為乙個無效位址,指標被不小心錯誤地修改,在與指標相關聯的記憶體區域被釋...
IO埠與記憶體空間
1 關於io與記憶體空間 在x86處理器中存在著i o空間的概念,i o空間是相對於記憶體空間而言的,它通過特定的指令in out來訪問。埠號標識了外設的暫存器位址。intel語法的in out指令格式為 in 累加器,out 累加器 目前,大多數嵌入式微控制器如arm powerpc等中並不提供i...