为什么我的程序遇到大值而不是小值的程序崩溃

Why do I get a program crash for large values but not small values for my program?

本文关键字:程序 崩溃 遇到 为什么 我的      更新时间:2023-10-16

为什么我的程序遇到大值而小值的程序崩溃?如果我输入 1-3,程序会执行它应该执行的操作,但是当我输入的数字大于该数字时,程序崩溃和/或无法完成?是与指针错误有关还是与我引用某些内容的方式有关?我不确定,所以任何帮助都是不胜感激的。谢谢!

法典:

#include <iostream>
using namespace std;
void getData (int size, int *Arr){
    cout << "nnEnter integer data one line at a timen" << endl ;
    for (int i=0; i < size; i++){
        cin >> Arr[i];
    }
}
void findMinAndMax(int array[], int size, int *min, int *max) {
    int smallest = array[0];
    int largest = array[0];
    *min = smallest;
    *max = largest;
    for (int i = 1; i < size; i++)
        {
            if (array[i] > *max){
                *max = array[i];
                cout << "Max Value (loop): " << *max << endl;
            }
            if (array[i] < *min){
                *min = array[i];
                cout << "Min Value (loop): " << *max << endl;
            }
        }
    // testing code
    cout << "Min Value: " << *min << endl;
    cout << "Max Value: " << *max << endl;
}
int *makeFrequency (int data[], int dSize, int *minDataValue, int *maxDataValue) {
    cout << "Min Value Pre: " << *minDataValue << endl;// testing code
    cout << "Max Value Pre: " << *maxDataValue << endl;// testing code
    findMinAndMax(data, dSize, minDataValue, maxDataValue);
    cout << "Min Value Post: " << *minDataValue << endl; // testing code
    cout << "Max Value Post: " << *maxDataValue << endl;// testing code

    int fSize = *minDataValue + *maxDataValue;
    cout << "fSize: " << fSize << endl; // testing code
    int *frequency;
    frequency = new int [fSize];
    // if frequency is 0, end
    if (frequency == 0)
        {
            return 0;
        }
    // set all elements to 0 in array frequency
    for (int i = 0; i <= fSize; i++) {
        frequency[i] = 0;
    }

    for (int i = 0; i <= dSize; i++) {
        int j = data[i] - (*minDataValue) + 1;
        frequency[j] = frequency[j] + 1;
    }
    return frequency;
}
void makeHistogram (int *freq, int min, int max ){
    cout << "Frequency Value HISTOGRAM: " << *freq << endl;
    cout << "nnn ----------- Histogram ----------------n" << endl;
    int size = min + max;
    cout << "Size Value HISTOGRAM: " << size << endl;
    for (int i = 0; i < size; i++){
        if (freq[i] > 0) {
            cout << "n" << min + i - 1 << ": ";
            for (int j = 0; j < freq[i]; j++) {
                cout << '*';
            }
        }
    }
    cout << endl << endl;
}
int main() {
    int dSize;
    int *ArrayOfInts;
    cout << "How many data values? ";
    cin >> dSize;
    ArrayOfInts = new int [dSize];
    getData(dSize, ArrayOfInts);

    int *frequency, min, max;
    frequency = makeFrequency(ArrayOfInts, dSize, &min, &max);
    if (frequency == 0) return -1;
    cout << "Min Value MAIN: " << min << endl; // testing code
    cout << "Max Value MAIN: " << max << endl; // testing code
    cout << "Frequency Value MAIN: " << *frequency << endl;
    makeHistogram(frequency, min, max);

    delete [] frequency;
    return 0;
}

一个有可能导致崩溃的未定义行为的地方:

在这里,您可以分配fSize元素:

frequency = new int [fSize];

稍后你迭代它直到fSize

for (int i = 0; i <= fSize; i++) {

你应该改为 i < fSize ,因为数组中没有 fSize 元素。后来i <= dSize也有同样的问题。应该i < dSize.

顺便说一句。我不明白为什么只有大值会导致代码崩溃,也许这只是 UB。

您设置fSize不正确。它应该是最大值和最小值之间的差值,而不是它们的总和。否则,如果列表中有负数,则frequency数组将太小。如果任何负数的绝对值大于最大数,则fSize将为负数,这对于数组的大小无效。

然后,您需要添加 1 以包含两个终结点。所以它应该是:

int fSize = *maxDataValue - *minDataValue + 1;

然后,正如另一个答案指出的那样,您需要修复for循环。当数组的大小N时,数组的索引从 0N-1 。所以它应该是:

for (int i = 0; i < fSize; i++) {

使用<作为循环测试,而不是<=。如果你尝试在数组之外写入,你会调用未定义的行为,所以任何事情都可能发生——如果你幸运的话,你会崩溃,但这并不能保证。

当您分配给frequency时,您会遇到类似的问题:

for (int i = 0; i <= dSize; i++) {
    int j = data[i] - (*minDataValue) + 1;
    frequency[j] = frequency[j] + 1;
}

*minDataValue时无需加1,这样做会导致您在data[i]最大值时超出数组。