2016-10-15 11 views
1

void配列の束にデータを格納してコピーするためにvoidポインターを使用しています。配列がいっぱいになると、残りのデータを新しい配列に書き込むようにしています。 たとえば、100バイトのvoidポインタがあります。私はすべてを配列に書きたいと思います。配列には50バイトの空き領域しかありませんので、残りの50を空き容量のある別の配列に書きたいと思います。 最初の50バイトを再利用せず、最後の50バイトにアクセスできるように、voidポインターのデータを「索引付け」することはできますか?voidポインターのメモリ部分にアクセスする

+0

なぜ誰かがこれを投票しましたか? – greenteam

答えて

4

voidポインターだけで留まる、いいえ。

あなたは、配列のインデックスを作成している、のは言わせて:

array[10] 

あなたはこのアドレスとして何をそれを逆参照されています。

配列がchar *の場合、charは完全型なので、問題はありません。コンパイラが各 "case"のサイズを知り、9番目の要素を与える命令(1st(1バイト))をコンパイラが知ることができます。 * arrayまたはarray [0])

ここでvoid *ポインタを使用し、9番目の要素にアクセスしようとします。

コンパイラは、単にそれが指すデータのサイズを知ることはできません。voidは完全な型ではありません。したがって、どのインデックスにもアクセスすることはできません。

したがって、無効なポインタのみを使用することはできません。

しかし、完全な型にするためにあなたのvoidポインタをキャストすることができます。例えば

void * destination; 
char * array = malloc(sizeof(char) * 512); 
destination = array; 

((char *)destination)[10] = 'n'; 

は完全に有効です。

+1

警告:GCC AS ANTENSIONは、voidを指すポインタの算術演算をサポートし、デフォルトでは警告を出さずにサイズ1として扱います。少なくとも-Wpointer-arithでコンパイルしてください。通常は '-Wall -pedantic'が最適です。 –

+0

ありがとう!私はコンテンツにアクセスしたら、それをvoidポインタに変換することも可能だと思います。 (私は実際にはまだ試してみませんでしたが、私は悪い仮定をしないことを願っています) – greenteam

+0

本当に興味深いです、私はその拡張について全く考えていませんでした。それを指摘してくれてありがとう! –

関連する問題