2017-04-11 22 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; 

質問>上記のコードの意味を理解できません。 1つのメモリブロックが次のブロックメモリを指しているようです。`*(unsigned int *)(unsigned int)ブロック+ n * i)の意味は?

誰か教えていただけますか?

+2

「void *」に対して算術演算を実行することはできません。元のプログラマーはすべてを 'unsigned int'にキャストして算術演算を許可し、それをポインタにキャストし直します。 ['std :: uintptr_t'](http://en.cppreference.com/w/cpp/types/integer)は、ポインタを格納するための正しい整数型であることに注意してください。 –

+1

これは、Standard C++では未定義の動作です。準拠するためには、 'size == sizeof(unsigned int)'と仮定して、 'void * block = new unsigned int [n]'とすることができます。 –

+0

@ q0987これはpublic/open sourceの一部ですか? –

答えて

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では、AFAISは、最初から最後まで次の要素を指します。上のデモンストレーションはとてもシンプルなように見えますが、コードの背後にあるロジックです。

+0

むしろ、ブロック[i] =&(ブロック[i + 1]) 'を実行しようとしているのです。 (OPのコードでは、 '='の右手オペランドは逆参照されないことに注意してください) –

0

あなたはかなり正確です - それはメモリのブロックを割り当てて、次にそれをいくつかのノードとして扱い、リンクされたリストとして一緒にリンクしています。

それが今の現状では、それはノード間のリンクと一緒にデータを保持するための任意のメモリを割り当てていないので、それは、かなり無意味に見えます(まあ、多分それはない - おそらくnsizeof(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> 'char * 'ではなく' unsigned * 'にキャストすべきですか? – q0987

関連する問題