char buf[
]= 「hello word」;
char
*p = 「hello world」;
buf[2] = 『e』;
正確 變數修改
p[2] = 『e』;
錯誤 常量修改
這是為什麼呢?
有初始值的陣列,陣列的初始值放在rodata段裡面,位址是固定的,需要絕對位址訪問。(注:絕對位址又名實體地址,相對位址又名邏輯位址)
陣列名(位址)對應開闢的空間上的數值存放在棧上,編譯器會去訪問rodata段上的初始值然後取來初始化區域性變數,因此陣列的值才能修改。
而指標指向的是rodata段,是不能被修改的。
strcpy
(buf,」hello world」)
; strcpy存在記憶體洩露
strncpy
(buf,」hello world」,10)
;
我們可以寫乙個**,測試下:
#include
intmain
(void
)
執行結果:
可以看到最後兩個的位址次才是相同的,字元陣列,後面的初始值雖然也是位於rodata,但是字元陣列的特殊性,相當於buf[0]=『h』;buf[1]=『e』;buf[2]=『l』;…buf[10]=』\0』;是從rodata處取得值複製到棧位址上。
陣列與指標, a和a
今天無意中看到一道題目,考察的是陣列與指標,如下 int a 5 int ptr1 int a 1 int ptr2 int a 1 printf d d n ptr1,ptr2 1 初一看,我想的答案是2,1,因為a是陣列名稱,也就是陣列的首位址,a 1指向的就是陣列的第二個元素了,也就是2,所以...
指標陣列和陣列指標 和 指標和陣列的定義與宣告
舉個栗子來區分以下指標陣列和陣列指標 int arr1 10 是指標陣列,arr1和 的結合性更高一些,所以arr1先與 結合成為陣列,陣列有10個元素,每個元素的型別都為int 型,所以 int arr1 10 是存放整型指標的陣列。int p 10 是陣列指標,p先與 結合,說明p是乙個指標變數...
指標陣列和陣列指標的區別與聯絡 引用和指標(二)
目錄 指標陣列和陣列指標的區別與聯絡 指標陣列 陣列指標 先舉個例子 乙個有10個指標的陣列 int a 10 乙個指向有10個整型數字陣列的指標 int a 10 include include int main system pause return 0 執行如下 我之前一直在想陣列指標的應用場...