![](/img/trans.png)
[英]Why can uninitialized pointer to int array be assigned variable's value?
[英]why a pointer can be assigned value?
我在這里有一個困惑:
int *a=*b;
a[1]=3;
a[2]=5
a是一個指針數組,並被賦值為b。 以我的理解,a []應該是地址,那么為什么在實踐中我們可以將值分配給指針(在本例中為a [])所在的位置? 有什么解釋嗎?
我假設這是C或Objective C / C ++的C子集,因為C +,Java,PHP和其他類似C的語言不使用指針。
每行使用代碼標簽和一條語句。
該聲明
int *a = *b;
創建一個作為int的指針。 不是指向int的指針,而是指向int的指針。
然后,無論b是什么,都將a中的當前地址設置為b的取消引用。 您沒有顯示b的聲明。 除非b的類型為int **
,否則您應該收到編譯器警告。
a不是指針數組。 a是一個指向int的指針。 它可以指向單個int,也可以指向一個int數組。 編譯器無法區別。
如果b的類型為int **
或指向int的指針,則您的語句將取消引用其中一個指針,並指向b內的第一個子數組。
編碼
a[1] = 3;
假定a是指向整數數組的指針,並且由於編譯器無法執行任何范圍檢查,因此它嘗試索引該數組並將值保存到指向的內存塊中的第二個int。 如果a指向的內存塊不足以包含至少2個整數,則此語句可能會在使用受保護內存的現代計算機上崩潰,也可能會覆蓋后面的內存。
作為@EdS。 在下面的評論中指出,這在業務中稱為
“未定義的行為”
如果要使用這樣的C指針,則要確保它確實指向有效內存,這是您的負擔,如果要像使用數組一樣使用指針,則負擔就很大了。您要確保不超出指針所指向的內存范圍。
但是,讓我們回答您的問題:
我在這里逐步介紹您的代碼(盡管出於示例目的對它進行了一些修改),並向您展示了它在假內存中的功能,因此您可以理解:
int b[4];
在這里,您分配了4個內存單元,並為b
標記了包含第一個內存單元地址的內存單元:
variable b
address 0x1 0x2 0x3 0x4 0x5
memory [0x2] [ | | | ]
然后:
int* a = b;
在這里,您分配了一個新的存儲單元,該存儲單元可以包含一個地址(如使用指針類型聲明的地址),並為其分配b
存儲單元的內容:
variable b a
address 0x1 0x2 0x3 0x4 0x5 0x6
memory [0x2] [ | | | ] [0x2]
然后:
a[1]=3;
a[2]=5;
您正在將值設置為a[1]
,該值使用指針算術轉換為*(a+1)
,即地址0x2 + 1
的內容,即0x3
內容。 與a[2]
。 現在的內存是:
variable b a
address 0x1 0x2 0x3 0x4 0x5 0x6
memory [0x2] [ | 3| 5| ] [0x2]
我希望這個ASCII可以使數組的工作方式更加清楚! 而且,您一定應該閱讀Kernighan和Ritchie的書 ,以及本文檔 ,它們都很好地解釋了如何管理整個內存以及指針算術和數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.