0

我正在尝试创建一个名为 Player 的类,它有一个名为 scores 的数组,在 Player 类属性中声明了一个大小。然而,当我初始化一个新播放器时,sizeof(scores) 方法给了我 20,事实上,初始化一个大小为 20 而不是 5 的分数数组。我想知道为什么以及如何解决这个问题。这是代码和输出。

    #include <iostream>
    #include <iomanip>
    #include <sstream>

    using namespace std;

    struct stats {
        unsigned int min;
        unsigned int max;
        unsigned int mode;
        unsigned int modeFreq;
        unsigned int mean;
        unsigned int total;
    };

    class Player {
        public:
            int scores[5];
            stats pStats;
            void inputScores();
            void calculateStats();
            void printScores();
    };

    void Player::printScores(){
        cout << "Printing Scores..." << endl;
        for (int i = 0; i < sizeof(scores); i++) {
            cout << scores[i] << endl;
        }
    }

    void Player::inputScores(){
        for (int i = 0; i < sizeof(scores); i++) {
            cout << "Enter a score for [" << i << "]: ";
            int input;
            cin >> input;
            scores[i] = input;
        }
    }

    int main() {
        Player p;
        cout << sizeof(p.scores);
        p.inputScores();
        p.printScores();
    }

这给了我这个:

    20
    Enter a score for [0]: 1
    Enter a score for [1]: 2
    Enter a score for [2]: 3
    Enter a score for [3]: 4
    Enter a score for [4]: 5
    Enter a score for [5]: 6
    Enter a score for [6]: 7
    Enter a score for [7]: 8
    Enter a score for [8]: 20
    Enter a score for [0]: 1
    Enter a score for [1]: 2
    Enter a score for [2]: 3
    Enter a score for [3]: 4
    Enter a score for [4]: 5
    Enter a score for [5]: 6
    Enter a score for [6]: 7
    Enter a score for [7]: 8
    Enter a score for [8]: 
    ....

以此类推,最多20...

4

1 回答 1

3

sizeof(scores)scores对象的字节大小,即5 * sizeof(int). 在会产生 20 的流行平台上。因此,您正在从 0 迭代到 19 并访问不存在的数组元素。

您观察到的奇怪输出只不过是由越界数组访问引起的未定义行为的表现。

那么,您为什么要尝试使用sizeof(scores)数组大小​​?

有一种sizeof基于 - 的技术可以确定数组大小,但它涉及将整个数组的字节大小除以单个元素的字节大小

sizeof scores / sizeof *scores

请记住,它仅适用于数组类型的对象(不适用于指针)。

或者,在现代 C++ 中,您可以使用

std::extent<decltype(scores)>::value

确定数组大小。

于 2017-03-29T02:48:33.030 回答