陣列和指標 與 rodata段的聯絡

2021-10-04 20:02:18 字數 755 閱讀 3549

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 執行如下 我之前一直在想陣列指標的應用場...