TransWikia.com

Переполнение массива

Stack Overflow на русском Asked by Konstantin on January 3, 2021

При компиляции когда ввожу граничные значения выдает ошибку о переполнении массива:
Run-Time Check Failure #2 – Stack around the variable ‘b’ was corrupted.

#include <iostream>
#include <time.h>
#include <windows.h>
#include <limits.h>
#define SIZE 10

using namespace std;
void rand_array(int[][SIZE], int, int);
void output(const int[][SIZE], int, int);
float diap(string, long, long);
void output_new(long[], int);
long sum(int, int[][SIZE], int);
void input_array(int[][SIZE], int, int);
void average(long[], int);

int main()

{
    SetConsoleOutputCP(1251);
    int a[SIZE][SIZE], row, col;
    long b[SIZE];
    row = diap("Введите кол-во строк матрицы-->", 0, 10);
    col = diap("Введите кол-во столбцов матрицы-->", 0, 10);
    int mode = diap("Enter a mode of formation(1-auto,2-manual)==>", 1, 2);
    switch (mode)
    {
    case 1: rand_array(a, row, col);break;
    case 2: input_array(a, row, col);
    }
    cout << "Исходная матрицаn";
    output(a, row, col);
    for (int i = 0; i <= col; i++)
    {
        b[i] = sum(i, a, row);
    }
    cout << "Измененная матрицаn";
    output_new(b, col);
    average(b, col);
    return 0;
}


void rand_array(int mas[][SIZE], int r, int c)
{
    srand(time(NULL));
    for (int i = 0;i < r;i++)
        for (int j = 0;j < c;j++)
            mas[i][j] = rand() % (r * c);
    return;
}
void output(const int mas[][SIZE], int r, int c)
{
    for (int i = 0;i < r;i++)
    {
        for (int j = 0;j < c;j++)
            cout << mas[i][j] << "t";
        cout << endl;
    }
    return;
}
float diap(string s, long low, long hight)
{
    float n;
    cout << s;
    cin >> n;
    if ((n < low) || (n > hight))
    {
        do
        {
            cout << "Incorrect value, try again=>>";
            cin >> n;
        } while ((n < low) || (n > hight));
    }
    return (float)n;
}
void output_new(long n_mas[], int kol_el)
{
    for (int i = 0;i < kol_el;i++)
        cout << n_mas[i] << "t";
    cout << endl;
    int summ = 0;
    float sra = 0;
    return;
}
long sum(int l, int mas[][SIZE], int rows)
{
    long S = 0;
    for (int i = 0; i < rows; i++)
    {
        S += mas[i][l];
    }
    return S;
}
void input_array(int mas[][SIZE], int rowl, int col)
{
    for (int i = 0; i < rowl; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << "Enter element index " << "[" << i << "]" << " " << "[" << j << "]" << endl;
            mas[i][j] = diap("=>", -32768, 32767);
        }
    }
    return;
}
void average(long n_mas[], int kol_el)
{
    int summ = 0;
    float av = 0;
    for (int i = 0; i < kol_el; i++)
        summ += n_mas[i];
    av = static_cast<float>(summ) / kol_el;
    cout << "Average=" << av;
}

One Answer

Если размер массива 10, то обратится к 10 элементу нельзя. А функция diap это пропускает. Я бы для начала написал хотя быт вот так

row = diap("Введите кол-во строк матрицы-->", 0, SIZE-1);
col = diap("Введите кол-во столбцов матрицы-->", 0, SIZE-1);

Answered by KoVadim on January 3, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP