[英]C++ Memory Address Allocation
道歉,我感到沮喪,並在沒有適當詳細信息的情況下通過手機發布了問題
考慮以下C ++代碼:
int arr[2];
arr[0] = 10;
arr[1] = 20;
// cout << &arr;
for (int i = 0; i < 2; i++)
{
cout << &arr + i << "\t\t"<<endl;
}
cout << sizeof (arr);
cout進入for循環打印
0x7ffeefbff580 0x7ffeefbff588
比第一個元素多8個字節
我的問題是,如果在我的機器上sizeof(int)是4,為什么還要再增加8個字節而不是4個字節?
現在,您已經給我們提供了代碼,我們可以回答您的問題。
因此,令人困惑的是: &arr + i
。 這並沒有按照您的想法做。 請記住, &
優先於+
。 因此,您取了arr
地址並將其向前移動i
次。
指針算術的工作方式是&x + 1
將指針向前移動size(x)
。 那么在您的情況下, size(arr)
多少? 它是8,因為它是2的整數數組(我假設int的大小為4)。 因此, &arr + 1
實際上會將指針向前移動8個字節。 您體驗的確切內容。 您不要求下一個int,而是要求下一個array 。 我鼓勵您嘗試一下,例如將arr
定義為int[3]
(大小為12),然后看看指針如何向前移動12個字節。
因此,第一個解決方案是不使用&
進行arr + i
。 我們可以將指針算術應用於數組,在這種情況下,它會退化為指針類型int*
。 現在,由於int
的大小為4,則arr + 1
正確指向向前4個字節的內存段。
但是我建議不要使用指針算法,而要使用&arr[i]
。 這樣做是一樣的,但是IMO不太容易出錯,也不會造成混亂,並且可以告訴我們更多有關此意圖的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.