为什么我的程序遇到大值而不是小值的程序崩溃
Why do I get a program crash for large values but not small values for my program?
为什么我的程序遇到大值而小值的程序崩溃?如果我输入 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
时,数组的索引从 0
到 N-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]
最大值时超出数组。
相关文章:
- 程序崩溃并显示"std::out_of_range"错误
- 试图创建流或fopen时程序崩溃
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- DLL Made with CMake 使程序崩溃
- 程序崩溃使用boost::asio
- 调用 free() 有时会导致程序崩溃
- 邮件加密程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- For 循环在尝试读取数组 c++ 时程序崩溃
- 即使有 0 个错误,Getter 似乎也会使程序崩溃
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- 无法访问的代码如何导致我的程序崩溃?
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- QCompleter set模型使应用程序崩溃
- 使用唯一指针调用函数会使我的程序崩溃
- 删除SDL_PollEvent时程序崩溃