動的に割り当てられた整数の配列を指す int * を「ダイブ」し、それを固定の int[] 配列として表すにはどうすればよいですか? 別の言い方をすれば、int * をダイブすると、アドレスと int が指すアドレスが表示されますが、代わりにすべての整数の配列が表示されます。
4 に答える
この質問の TotalView タグに気付きました。totalview で配列の値を確認する方法を尋ねていますか? もしそうなら、答えはとても簡単です。
int * 型のポインタ p があり、現在 10 個の整数を持つ配列を指しているとします。
ステップ 1. ポインターに飛び込みます。これは、ソース コード ペインまたはスタック フレーム ペイン内の変数にマウス カーソルを置いた後、ダブルクリックするか、マウスの中ボタンをクリックするか、コンテキスト メニューのダイブ オプションを使用することによって実行されます。
これにより、次のような新しいウィンドウが表示されます
式: p アドレス: 0xbfaa1234 タイプ: int *
データ領域の下には、次のようなメッセージが表示されます
0x08059199 -> 0x000001a5 (412)
このウィンドウにはポインター自体が表示されており、リストされているアドレスはポインターのアドレスです。値 (上記の例では 0x08059199) は、ポインターが持つ実際の値です。矢印の右側にあるものはすべて、それが指し示したいことを示す「ヒント」にすぎません。
ステップ 2. 再びポインターに飛び込みます。今度は変数ウィンドウのデータ値で、ダブルクリックまたはマウスの中ボタンを繰り返します。(つまり、0x08059199 と表示されている場所をダブルクリックします)。
これにより、ポインターが効果的に「逆参照」されます。現在、ウィンドウはポインター自体ではなく、ポインターが指している物にフォーカスされています。アドレス ボックスには、以前の値であった 0x08059199 が含まれていることに注意してください。
式: *(((int *) p)) アドレス: 0x08059199 タイプ: int
データ領域の下に、次のように表示されます
0x000001a5 (412)
ステップ 3. データ ウィンドウを必要なタイプにキャストします。type フィールドをクリックして、int[10] に変更します。次に、リターンを押します。
これにより、0x08059199 が 10 個の整数の配列の先頭であることをデバッガーに伝えます。
ウィンドウには、Slice と Filter という 2 つの新しいフィールドが表示されます。今はそのままにしておくこともできますが、後で役に立つことがあります。
データ領域には、「フィールド」と「値」の 2 つの列と 10 行が表示されます。
フィールド列は配列 [0] - [9] のインデックスになり、値列は各配列位置にあるデータを示します。
その他のヒント:
より複雑なデータ構造では、個々の要素に飛び込みたい場合があります (これはポインターの場合もあり、飛び込みはそれらも逆参照します)。
いつでもさまざまな型または長さにキャストして、データを「あたかもそうであるかのように」見ることができます。
値列をクリックしてそこにあるものを編集することで、実際のデータ値を編集できます。これは、アプリケーションから特定の誤動作を引き起こしたい場合に役立ちます。
変数ウィンドウの右上隅にある「<」アイコンを使用して、いつでもダイビング操作を元に戻すことができます。
役立つオンライン ビデオがいくつかあります。
http://www.roguewave.com/products/totalview/resources/videos.aspx
特に、「TotalView を使い始める」というラベルの付いたものがあります。
TotalView の使用に関するヒントについては、Rogue Wave Software までお気軽にお問い合わせください。roguewave dot com でのサポートは、そのための適切なアドレスです。
Chris Gottbrath (roguewave dot com の Chris dot Gottbrath) Rogue Wave Software の TotalView プロダクト マネージャー
それほど難しくはありませんが、正確にどのように機能するかを忘れていました。それを説明しているページを見つけました;)。たとえば、test と呼ばれる int を指定して配列するには、&test を使用して取得する必要があると思います。このページをチェックしてください:
配列内の int の数を正確に知らなければ、これを意味のある方法で行うことはできません。
動的に割り当てられた連続データまたは静的配列int *p
の最初の要素を指すがある場合、配列であるかのようにインデックスを付けることができます。int
int *data = malloc(3 * sizeof *data);
int *p;
/* malloc error detection omitted for brevity */
data[0] = 1;
data[1] = 2;
data[3] = 42;
p = data;
assert(p[0] == 1);
assert(p[1] == 2);
assert(p[2] == 42);
この方法でアクセスしている有効なデータのサイズを知る必要があります。
それで、私がdata
上記のように持っていて、それを印刷する関数を書きたいとしましょう。次のように関数を宣言することはできません。
void print_array(int *data);
を呼び出すprint_array(data);
と、関数は出力する要素の数がわからないためです。
print_array()
次のように定義できます。
void print_array(int *data, size_t n);
wheren
はdata
、呼び出し元が指定する必要がある、 が指す有効な要素の数を示します。または、すべての「配列」がセンチネル値で終わるように決定することもできます。これは、データの最後でのみ使用される値であり、それ以外の場合は有用な値ではありません。
data[2] = 0; /* data[0] and data[1] are useful, valid values
and data[2] is 0 to signify the end of the data */
次に、次のように宣言できますprint_array()
。
void print_array(int *data);
data
センチネルに到達するまで、関数定義にインデックスを付け続けます。
void print_array(int *data)
{
size_t i;
for (i=0; data[i] != 0; ++i)
printf("%d\n", data[i]);
}
したがって、あなたの質問に答えるために、動的に割り当てられた有効なデータへのポインターを配列として扱うことができます。もちろん、割り当てられたデータのサイズを覚えておく必要があります。これは、通常の配列でも行う必要があります。