2017-04-11 324 views
2
void* block = ::operator new(n*size); 
int i; 
for(i = 0;i<BLOCK_SIZE -1;i++){ 
    *(unsigned int*)((unsigned int)block + n*i) = (unsigned int)block + n*(1+i); 
} 
*(unsigned int*)((unsigned int)block + n*i) = 0; 

問題>我無法理解上面代碼的含義。看起來,一塊內存正在指向下一個塊存儲器。'*(unsigned int *)((unsigned int)block + n * i)是什麼意思'

有人可以請給我解釋一下嗎?

+2

您無法對'void *'執行算術運算。原始程序員將所有東西都轉換爲'unsigned int'以允許算術,然後將其轉換回指針。請注意,['std :: uintptr_t'](http://en.cppreference.com/w/cpp/types/整數)是存儲指針的正確整數類型。 –

+1

還要注意,這是標準C++中未定義的行爲;因爲它符合規定,分配可以是'void * block = new unsigned int [n]',假設'size == sizeof(unsigned int)' –

+0

@ q0987這是一些公開/開源代碼的一部分嗎? –

回答

0
block[0] = &block[1] 
block[1] = &block[2] 
block[2] = &block[3] 
. 
. 
. 
block[n] = 0 // dereferenced so not NULL, assigned zero as a value 

AFAIS,它從頭到尾指向下一個元素。儘管上面的演示看起來很簡單,但它是代碼背後的邏輯。

+0

而不是嘗試'block [i] =&(block [i + 1])'。 (請注意,在OP的代碼中,該'='的右側操作數不是取消引用的) –

0

你已經得到它非常正確 - 它分配一塊內存,然後將其視爲多個節點,並將它們作爲鏈接列表鏈接在一起。

因爲它現在代表,它看起來相當沒有意義的,因爲它沒有分配任何內存來保存與節點之間的聯繫以及數據(好吧,也許它 - 也許n實際上比sizeof(unsigned *)size更大大於BLOCK_SIZE,所以它可以容納較大的物品)。

如果我打算做這樣的事情,我可能會寫代碼更是這樣的:

unsigned *block = (unsigned *)::operator new(n*size); 

for (size_t i=0; i<size-2; i++) 
    block[i] = &block[i+1]; 
block[size-1] = nullptr; 

當然,缺乏理由這樣做,這是很值得懷疑,以及 - 最代碼可能會很好,例如:

std::vector<unsigned *> block(size); 
for (int i=0; i<size-2; i++) 
    block[i] = &block[i+1]; 
block[size-1] = 0; 
+0

Q>爲什麼我們應該轉換爲'unsigned *'而不是'char *'? – q0987