2011-12-19 4 views
1

アプリケーションでは、このような問題があります。 方法は、ユーザーがグローバルメモリプールからメモリを取得するために、汎用的なインタフェースを提供するように設計のように実装されました:アドレスを無効ポインタに揃える方法は?

shmPool shm; 
void getMemory(void* mPtr){ 
    mPtr = &shm; 
} 

が、mPtrの値が変更されていないことは明らかです。どのようにして、ポインタの値を未知の型ポインタに揃えることが可能です。

+0

'mPtr'ポインタは値によって渡され、その値は関数呼び出しの外側では変更されません。また、実際に何も返さない 'get'関数を持っているのはちょっと変わっていませんか? – ereOn

+2

あなたは2つの問題を抱えているようです:(1) 'mPtr'の変更方法と(2)指定された境界にメモリを揃える方法。どちらに問題がありますか? –

+0

1)voidポインタを揃える必要はなく、 'shm'のアドレスのアライメントを取得します。 2)あなたの関数は何も返しません - あなたはポインタをポインタに渡すか、ポインタを返すべきです。 – Lindydancer

答えて

4

アウトパラメータを使用するのではなく、単にポインタを返すのはなぜですか?ここで

void* getMemory() { 
    return &shm; 
} 
+0

私は0が成功を意味し、1がシステムリソースが利用不可能であることを意味するようにメモリの割り当てが成功したかどうかを返すようにしたいので、 –

+0

この場合、失敗を示すためにヌルポインタを返すことができます。または、例外をスローする可能性があります。 –

+0

私は例外をスローする方法を考えており、私は別の方法を学びたいだけです。私はそれについて興味があります。私はvoid **とreinterpret_castを使用して解決しました。それは私のためにうまくいきました。まだ多くの感謝です。 –

0

mPtrはローカル変数です。ローカルコピーのみが変更されます。なぜ他の変数が変更されるのですか?別のポインタを変更する場合は、参照またはポインタを使用する必要があります。

+0

私はvoid **でそれをやったが、参考にするのは少し危険です。ありがとう –

+0

@ Cyber​​_Rush:参照はポインタよりもはるかに危険です。 –

+0

もっと教えていただけますか?私はこれの基本的な部分をかなり理解していません。 THX –

2

は、呼び出し側がshmへのポインタを受け取ることになりますので、修正、あなたのコードです:

shmPool shm; 
void getMemory(void** mPtr){ 
    *mPtr = &shm; 
} 

のように呼び出し側がこの関数を呼び出します:あなたの質問は何にを持っていない

shmPool* p; 
getMemory(&p); 
// now p is a valid pointer 

メモリを整列させて行うそこにあなたのコードに問題はしかしあるので、塩の粒で私の答えを取る:

  1. あなたはvoid*にオブジェクトをキャストしているのはなぜ?これはほぼ確実に悪いことです。
  2. 私は@BjörnPollexに同意します。この例では、outパラメータではなく戻り値を使用するほうがよいと思います。
+0

1.私はメモリ管理システムのような仕事をしていて、メソッドへのポインタを渡してから、 。 –

+0

2.それは確かにvoid *を返すように働くでしょう、私は別の方法がある場合、私はちょうど好奇心です。 void **とinterpret_castはうまくいきます –

関連する問題