1

C++を使用してint配列を作成し、その長さを取得しようとしています

int *masterArray;
int count = 0;
int a = 0;
int var = 0;
ifstream myfile("sample_10.txt");
if (myfile.is_open())
{
    while(myfile.good())
    {

            string word;

        while(getline(myfile, word))
        {
            count++;
        }

        cout << "count: " << count << endl;
        masterArray = new int [count];

        myfile.clear();
        myfile.seekg(0);
        while(getline(myfile, word, '\n'))
        {
            cout << word  << " ";
            istringstream ( word ) >> var;
            masterArray[a] = var;

            a ++;
        }
    }
}

int配列の名前はマスター配列であり、配列に変数を追加した後..

cout << "sizeof(masterArray) : " <<sizeof(masterArray);

10 ではなく 8 になります。

配列に格納されているすべての変数を出力しようとしたところ、10 が返されました。これは、すべての変数が正しく格納されていることを意味します。

実行して長さを取得する必要がありますか

cout << "sizeof(masterArray) : " <<sizeof(masterArray) / sizeof(*masterArray);

??

それは私に2を与えるからです(明らかに、8を4で割っています)

ありがとう

4

8 に答える 8

2

あなたの場合に使用することをお勧めしstd::vectorます。C++ では、配列のようなオブジェクトにベクトルを使用するのが一般的であることに注意してください。動的に割り当てられた配列を自分で管理したい場合は、非常に強力な引数が必要です。

于 2012-08-07T07:05:21.327 に答える
2

あなたのmasterArray変数はポインタ型です。64ビットマシンを使用していると思われるため、ポインターは8バイトです。そのため、 を実行すると 8 が返されますsizeof()

配列のサイズを取得する標準的な方法はありません。少なくとも私が知っている方法はありません。countユーザーから取得して配列を割り当てることができます。保管して使ったほうがいいと思います。

于 2012-08-07T05:45:09.573 に答える
1

これ

sizeof(masterArray);

int*は、プラットフォーム上の のサイズを示します8(または、 bit を想定すると 648ビットchar)。

コードを見ると、配列の代わりにstd::vectorを使用し、 std::vector::push_backメソッドを使用して要素を追加できるように思えます。実際に長さが必要な場合は、size()メソッドから取得できますが、ベクトルで通常行うことは、開始イテレータと終了イテレータを使用して内容を反復処理することです (メソッドbegin()end()それぞれを参照)。

于 2012-08-07T05:43:12.407 に答える
1

64ビットコンピューターを使用していると思いますか?sizeof は、この場合はポインタ、つまり 64 ビット コンピュータでは 8 バイトに等しいメモリ アドレスを指定した変数のサイズを返します。cで配列の長さを見つけるには、配列のサイズが格納された別の変数を使用する必要があります。

于 2012-08-07T05:46:40.423 に答える
1

すでに長さを取得しています - それはcountです。手動で追跡することによって、動的に割り当てられた配列の長さを知る唯一の方法です。他の人が指摘したように、を介して配列を割り当てる場合、最初の要素へのポインターのみを取得しますnewsizeof(masterArray)はこのポインタのサイズを返しますが、プラットフォームではたまたま 8 バイトです。

于 2012-08-07T05:47:11.163 に答える
0

を使用して書き直した例を次に示しますstd::vector

std::vector<int> masterArray;
int var = 0;

ifstream myfile("sample_10.txt");
if (myfile.is_open())
{
    while(myfile.good())
    {

            string word;

        while(getline(myfile, word))
        {
            count++;
        }

        cout << "count: " << count << endl;
        masterArray.reserve(count); // will allocate at least count ints

        myfile.clear();
        myfile.seekg(0);
        while(getline(myfile, word, '\n'))
        {
            cout << word  << " ";
            istringstream ( word ) >> var;
            masterArray.push_back(var); // store the current word
        }
    }
}
于 2012-08-07T07:34:58.617 に答える
0

を使用して配列内の要素sizeofの数を取得することは、配列として宣言されている変数に対してのみ機能します。例。int masterArray[10];

あなたの配列はint *- 後で動的に割り当てられる - として宣言されているので、その型のサイズを取得しています。

于 2012-08-07T05:43:52.820 に答える
0

sizeof() は配列でのみ機能します。ポインターは 8 バイト (64 ビット システム上) であるため、8 を取得しています。動的に割り当てられた配列の長さを決定することはできません。これは、長さを再決定するのではなく、長さを追跡する必要があることを意味します。

ところで、これはベクトルを使用するのに非常に適した状況に見えます。

于 2012-08-07T05:44:27.677 に答える