在c ++中获取数组的长度

时间:2012-08-07 05:39:44

标签: c++ arrays sizeof

我正在使用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数组的名称是master数组,在我在数组中添加变量之后 我做..

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

给了我8而不是10。

我试图打印出存储在数组中的所有变量,它给出了10,这意味着所有变量都存储正确。

我应该通过

来检索长度
cout << "sizeof(masterArray) : " <<sizeof(masterArray) / sizeof(*masterArray);

...

因为这给了我2(显然,因为它将8除以4)

由于

8 个答案:

答案 0 :(得分:2)

您的masterArray变量属于指针类型。我想你是64位机器,所以指针是8字节。这就是为什么当你做sizeof()时它给你8。

没有标准的方法来获取数组的大小,至少不是我所知道的。您从用户处获得count并分配数组。我想最好保留并使用它。

答案 1 :(得分:2)

我建议您使用std::vector。请注意,在C ++中,将向量用于任何类似数组的对象是一种常见做法。如果你想自己管理动态分配的数组,你应该有非常强大的参数。

答案 2 :(得分:1)

sizeof(masterArray);

为您提供int*的大小,在您的平台上为8(或64位,假设8char。)

查看您的代码,在我看来,您可以使用std::vector代替数组,并使用std::vector::push_back方法添加元素。如果你确实需要长度,你可以从size()方法得到它,但是你通常用向量做的是使用它的开始和结束迭代器迭代它的内容(参见方法begin()和{分别为{1}}。

答案 3 :(得分:1)

我猜您正在使用64位计算机? sizeof返回它给出的变量的大小,在这种情况下是一个指针,换句话说,一个存储器地址,在64位计算机中等于8个字节。为了在c中找到数组的长度,你需要使用另一个存储在其中的数组大小的变量。

答案 4 :(得分:1)

你已经得到了长度 - 它是count。这是了解动态分配数组长度的唯一方法,通过手动跟踪它。正如其他人指出的那样,如果通过new分配数组,则只能获得指向第一个元素的指针。 sizeof(masterArray)将返回此指针的大小,它恰好是您平台上的8个字节。

答案 5 :(得分:0)

使用sizeof获取数组中的元素数仅适用于声明为数组的变量。例如。 int masterArray[10];

您的数组被声明为int * - 后来动态分配 - 因此您可以获得该类型的大小。

答案 6 :(得分:0)

sizeof()仅适用于数组。你得到8因为指针是8字节(在64位系统上)。您无法确定动态分配的数组的长度。这意味着您需要跟踪长度,而不是重新确定它。

顺便说一下,使用矢量看起来非常好。

答案 7 :(得分: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
        }
    }
}