2016-05-18 2 views
0

をcharにアドレス/ポインタを取得:ストアと我々はchar型の配列があるとしましょう配列

char pool[1000]; 

とポインタ

char* ptr; 

ポインタを格納プール内のデータのブロックにアドレスを。私はプールにこのアドレスを保存し、同様にそれを取得します。

基本的に、私がしたいことは、char配列プールに埋め込まれたリンクリストです。その理由は、私は新しい変数を(グローバルに)作成することは許されておらず、他の制限のなかでも新しいヘッダを含めることができないからです。

したがって、問題は、プールの最初の4つの要素を4バイトのアドレスに分割してフィッティングする方法と、変更のために再び取得する方法です。

この操作は頻繁に行われるため、高速にする必要があります。もちろん、外部機能は使用できません。 poolptrの値を格納する

+0

あなたはスタックアロケータに似た何かが欲しいのですか?プールの使用済み部分をどのように追跡したいのですか? – vu1p3n0x

+0

参考:http://stackoverflow.com/q/20945439/1870232 – P0W

+0

@ P0Wこれは参考になります。しかし、私はグローバル変数を宣言することはできないので、プールに格納します。 – Nawar

答えて

1

、使用:

memcpy(pool, &ptr, sizeof(ptr)); 

poolから使用するポインタの値を取得するには:

memcpy(&ptr, pool, sizeof(ptr)); 

日時:

この動作が頻繁に起こるため、高速である必要があります...もちろん、外部fに依存しません服従。

memcpyが必要です。 memcpyを使用できない場合は、コードに正確な機能を実装する必要があります。

memcpyの呼び出しがパフォーマンスのボトルネックであることを確認できない限り、私はそれを使用することをお勧めします。

+0

string.h/cstringが必要なので使用できません。 'code' 無効myMemCpy(void *型のdest、void *型SRC、size_tのN) { \t //型キャストsrcとdestのアドレス(のchar *)に:私はので、私はmemcpyのために、この実装を使用している – Nawar

+0

それを書いてみます \t char * csrc =(char *)src; \t char * cdest =(char *)dest; (; iがN <; I = 0をint型私は++)は[] \tをdestに \t SRCの//コピーコンテンツ[] \t { \t \t cdest [I] = CSRC [I]。 \t \t std :: cout << "i =" << i << std :: endl; \t} } 'code' ポインタは配列に格納されません。それは単にポインタを配列アドレスにセットするだけです。 – Nawar

+0

@ Nawar、よかったね。それは動作しましたか? –

0

プールにptrを保存する場合は、代わりにアドレスプールを使用する必要がありますか?

char *pool[1000]; 

その後

pool[0] = ptr; 
ptr = pool[0]; 
etc. 

あなたは文字のバッファを扱う必要がある場合、それは

char pool[1000]; 

ですが、アドレスのバッファとして扱い、ローカルを作成することによって、それを曲げます変数:

char **pp = reinterpret_cast<char**>(&pool); 
*pp = ptr; 

後でバッファプールの先頭にptrが格納されます。それを取得するには:

あなたはポインタ
pp++ // next address 

pp

をインクリメントすることにより、プールに沿って移動することができるとアドレスは4バイトであるという仮定をしない
ptr = *pp; 

+0

私もこれを試してみます – Nawar

関連する問題