3

動的に割り当てられた整数の配列を指す int * を「ダイブ」し、それを固定の int[] 配列として表すにはどうすればよいですか? 別の言い方をすれば、int * をダイブすると、アドレスと int が指すアドレスが表示されますが、代わりにすべての整数の配列が表示されます。

4

4 に答える 4

8

この質問の 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 プロダクト マネージャー

于 2010-01-22T16:56:46.997 に答える
0

それほど難しくはありませんが、正確にどのように機能するかを忘れていました。それを説明しているページを見つけました;)。たとえば、test と呼ばれる int を指定して配列するには、&test を使用して取得する必要があると思います。このページをチェックしてください:

http://www.cplusplus.com/doc/tutorial/pointers/

于 2010-01-21T16:01:02.860 に答える
0

配列内の int の数を正確に知らなければ、これを意味のある方法で行うことはできません。

于 2010-01-21T16:02:04.060 に答える
-2

動的に割り当てられた連続データまたは静的配列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);

wherendata、呼び出し元が指定する必要がある、 が指す有効な要素の数を示します。または、すべての「配列」がセンチネル値で終わるように決定することもできます。これは、データの最後でのみ使用される値であり、それ以外の場合は有用な値ではありません。

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]);
}

したがって、あなたの質問に答えるために、動的に割り当てられた有効なデータへのポインターを配列として扱うことができます。もちろん、割り当てられたデータのサイズを覚えておく必要があります。これは、通常の配列でも行う必要があります。

于 2010-01-21T16:02:50.987 に答える