如何修复数组的大小?

时间:2018-02-08 20:09:09

标签: c++ arrays

大家。我正在努力理解为什么我的数字变量保持输出1.我试图在元素数量等于数组的大小的任何时候加倍大小但我最终没有得到我的代码的那部分附近。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int selection;
    int size = 2;
    // Initializing the array
    int *dArray;
    int v = 0;
    int i, j, temp;
    dArray = new int[size];
    dArray[0] = 2;
    dArray[1] = 3;
    int numbers = sizeof(dArray) / sizeof(dArray[0]);
    do {
        // Printing the menu
        cout << "1) Print Elements" << endl;
        cout << "2) Add Element" << endl;
        cout << "3) Delete Element" << endl;
        cout << "4) Return Size" << endl;
        cout << "5) Exit" << endl;
        cout << "Enter your selection number: ";
        cin >> selection;
        switch (selection)
        {
        case 1:
            // Outputting the elements
            for (int i = 0; i < size-1; i++) 
            {
                cout << dArray[i] << ", ";
            }
            cout << dArray[size - 1] <<endl;
            cout << numbers << endl;
        break;
        case 2:
            // Asking for another element
            cout << "What number shall be put into the array? \n";
            cin >> v;
            if (numbers== size)
            {
                // If the size is too small...
                int *nArray = new int[2 * size];
                for (int i = 0; i < size; ++i)
                {
                    nArray[i] = dArray[i];
                }
                delete[] dArray;
                dArray = nArray;
                // Finished creating a new array
                cout << "Array size expanded to " << 2 * size << endl;
                // Adding the element
                dArray[size] = v;
                size = 2 * size;
                // Sorting the elements
                for(i=0;i<numbers;i++)
                {
                    for(j=i+1;j<numbers;j++)
                    {
                        if(dArray[i]>dArray[j])
                        {
                            temp =dArray[i];
                            dArray[i]=dArray[j];
                            dArray[j]=temp;
                        }
                    }
                }
            }
            else
            {
                // Adding the element
                dArray[size] = v;
                size = 2 * size;
                // Sorting the elements
                for(i=0;i<numbers;i++)
                {
                    for(j=i+1;j<numbers;j++)
                    {
                        if(dArray[i]>dArray[j])
                        {
                            temp =dArray[i];
                            dArray[i]=dArray[j];
                            dArray[j]=temp;
                        }
                    }
                }
            }
        break;
        }
    } while (selection!= 5);
    cin.get();
    cin.ignore();
    return 0;

}

有谁知道为什么sizeof函数会这样做?

3 个答案:

答案 0 :(得分:1)

这是数组的大小。它是指针的大小除以int的大小。

int numbers = sizeof(dArray) / sizeof(dArray[0]);

这是程序中数组的大小。

int numbers = size;

答案 1 :(得分:1)

sizeof(dArray)为您提供dArray的大小。 dArray定义为int *dArray,因此其大小为sizeof(int*)。无论指针指向什么,这都不会改变。这与实际数组不同;您的大小代码可以与int dArray[3];一起正常使用。

要获得数组的大小,只需使用size变量;这是分配的int个对象的数量。

更好的是,使用std::vector<int>;size()成员函数会告诉您它有多少元素。

答案 2 :(得分:0)

int numbers = sizeof(dArray) / sizeof(dArray[0]);

数字正在解析为1,因为dArray是指向数组开头的指针,而不是数组本身。当你调用sizeof()时,你得到的是指针的大小,而不是数组。在32位应用程序上,指针是32位(4字节),第一个int也是32位(4字节)。那么这句话解决的是

int numbers = 4 / 4;

离开1.如果你改为声明了一个双精度数组,那么sizeof(dArray [0])将是8,但指针的大小仍然是4,所以语句将解析为数字= 4/8 = .5 ,但由于数字是一个int,它只会解析为0.所以你的代码仍然会以新的令人兴奋的方式破解。

有趣的是,如果您将其编译为64位应用程序sizeof(dArray)将是64位(8字节),那么您将得到数字= 8/4 = 2,如您所料。然后你会把你的数组大小增加一倍,你的代码就会破坏,因为数字会分解为2,这可能会更加令人困惑,所以要感谢你现在抓住了它!

我同意其他人所说的话。如果你使用Vector,你可以继续将值推到它的末尾,让它担心改变数组的大小!