2017-10-23 6 views
0

現在、私はいくつかの構造体、ポインタ、およびmalloc関数を扱っています。それは、他の変数の中でも、malloc関数を使って割り当てられたメモリ空間へのポインタを保持する構造体を持っています。カウント変数を持つポインタへのポインタのオフセット

私はこのスペースを使用してサンプルを格納しています。したがって、単純なカウント変数を使用してサンプルの数を追跡しています。今私の困難は、データを格納するためにトリプルポインタ(符号付きchar ***)を使用する私のI2C関数とのインタフェースから生じる。

これを処理するには、構造体のポインタから提供されるメモリ空間を指すdoubleポインタ(signed char **)を使用します。次に、count変数を使用してこのポインタをシフトします。

私が探しているのは、オフセットの追加は単に初期ポインタが保持されているメモリからインクリメントしているということです。

私がこれを達成しようとしているコード行は以下の通りです。

signed char** VAL_PTR = ((signed char**)(&mem.Accel.xBase)) + ((signed char) mem.Accel.SampleCount); 

どこに間違っているのか誰にでも見えますか?どんな助けでも大歓迎です!

+1

ようになります。< - [三ことはありませんStar Programmer](http://wiki.c2.com/?ThreeStarProgrammer)を参照してください。実際、あなたが提示しているコードは、複雑すぎます。いずれにしても、厳密なエイリアシングルールに精通していることがあります。データ構造とプログラムフローを最初に設計し、**簡単な**デザインを目指します。 –

+0

すべての変数のタイプを示す完全な(ただし最小限の)例を見て、期待される結果が何であり、代わりに何が得られるかを説明する必要があります。単語で表示するよりもコードで表示する方が良いです。 – interjay

答えて

0

xBaseがポインタの場合、xBase(つまり&xBase)へのポインタは、基本的にポインタの1つの要素の配列の最初の要素へのポインタと同じです。あなたのケースでは&xBaseは基本的にタイプsigned char *[1]に相当します。

I.e.あなたが任意のポインタや配列pとインデックスiのために、表現*(p + i)p[i]と正確に一致していることを覚えていれば、それが今、この

 
+-------+ 
| xBase | 
+-------+ 
^ 
| 
&xBase 

ようになります。 &xBaseSampleCountに代入すると、*((&xBase) + SampleCount)(&xBase)[SampleCount]となり、要素番号SampleCount + 1の配列はとなります。要素です。それは範囲外です。 "トリプルポインタ(signed char型\ * \ * \ *)を使用しています* *"

あなた付加した上で "画像"

 
+-------+ 
| xBase |    ??? 
+-------+ 
^      ^
|      | 
&xBase     &xBase + SampleCount 
+0

要するに、ポインターへのポインターを割り当てるときに、xBaseが指すアドレスにオフセットを追加できるかどうか尋ねていますか? –

+0

@ A.Derby要するに、いいえ。 '&xBase + SampleCount'はどこでも有効ではありません。しかし、もちろん 'xBase + SampleCount'を行うことができます。'&(xBase [SampleCount]) '(これは' SampleCount'の値が有効なインデックスを必要とすることを意味します)と同じです。 ***しかし、***キャストは正しいとは思われません。メモリ内の各要素が 'xBase' *で指されていなければ、ポインタになります。 –

+0

これは幻想的です。 ポインタの互換性を可能にするために型キャストを使用しました。 ありがとうございます! –

関連する問題