Как исправить ошибку: “warning C6385: Переполнение буфера при записи в … ”?

395
18 марта 2018, 21:26

// Массив должен выводится с доп. столбцом в начале и после этого выдавать запрос на продолжение работы в программе или выход. Переполнение происходит после вывода массива с доп столбцом.

Main.cpp

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>
#include "Functions.h"

int main(void)
{
    int n, m, i;
    int **a;
    char s = 'n';
    while (s != 'Y' && s != 'y')
    {
        printf("\n Enter the dimension of the matrix A[n][m]");
        printf("\n Number of columns N = ");
        scanf_s(" %d", &n);
        printf("\n Number of rows M = ");
        scanf_s(" %d", &m);
        if ((a = (int**)calloc(n, sizeof(int*))) == 0)
        {
            printf("\n Memory allocation failure Array **a \n");
            exit(1);
        }
        for (i = 0; i < n; i++)
            if ((a[i] = (int*)calloc(m, sizeof(int))) == 0)
            {
                printf("\n Memory allocation failure Array *a \n");
                exit(1);
            }
        ReadMatr(a, n, m);
        PrintMatr(a, n, m);
        AddColumn(a, n, m);
        freeArray(a, n);
    printf("Close program \n Y - Yes N - No \n");
    s = _getch();
    }
    return 0;
}

Functions.cpp

#include <stdio.h>
#include <stdlib.h>
#include "functions.h"

void ReadMatr(int **M, int n, int m)
{
    int i, j;
    for (i = 0; i<n; i++)
        for (j = 0; j<m; j++)
            M[i][j] = rand() % (n*m);
    return;
}
void PrintMatr(int **M, int n, int m)
{
    int i, j;
    printf("\n Output matrix A[%d][%d]:\n", n, m);
    for (i = 0; i<n; i++)
    {
        for (j = 0; j<m; j++)
            printf(" %4d ", M[i][j]);
        printf("\n");
    }
    return;
}
void AddColumn(int **M, int n, int m)
{
    int i, j, *Temp;
    int C1 = m + 1;
    for (i = 0; i < n; i++)
    {
        if ((Temp = (int*)realloc(M[i], C1 * sizeof(int))) == 0)
        {
            printf("Memory allocation failure after expanding for *a");
            exit(1);
        }
    }
    for (int i = m; i < C1; i++) {
        if ((M[i] = (int *)calloc(n, sizeof(int))) == 0) {
            printf("\nMemory allocation failure *a");
            exit(1);
        }
            for (j = m; j < C1; j++)
                M[i][j] = rand() % (n*m);
        printf("\n Output matrix with an additional column A[%d][%d]:\n", n, m);
        for (i = 0; i < n; i++)
        {
            for (j = C1; j > 0; j--)
            {
                 int Temp = M[i][j - 1];
                M[i][j] = M[i][j - 1];
                M[i][j] = Temp;
            }
        }
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < C1; j++)
                printf(" %4d ", M[i][j]);
            printf("\n");
        }
    }
    return;
}
void freeArray(int **M, int n)
    {
    int i;
    for (i = 0; i < n; i++)
        {
            free(M[i]);
        }
    free(M);
    }

Functions.h

void ReadMatr(int **, int, int);
void PrintMatr(int **, int, int);
void AddColumn(int **, int, int);
void freeArray(int **, int);

Не могу понять как исправить эти ошибки

Answer 1

Корректная функция AddColumn:

void AddColumn(int **M, int n, int m)
{
    int i, j;
    int C1 = m + 1;
    //выделяем память под ещё один столбец
    for (i = 0; i < n; i++)
    {
        if ((M[i] = (int*)realloc(M[i], C1 * sizeof(int))) == 0)
        {
            printf("Memory allocation failure after expanding for *a");
            exit(1);
        }
    }
    //двигаем все столбцы на один вправо
    for (int j = C1-1; j > 0; j--){
        for (int i = 0; i < n; i++){
            int tmp = M[i][j];
            M[i][j] = M[i][j-1];
            M[i][j-1] = tmp;
        }
    }
    //заполняем крайний слева столбец случайными числами
    for (int i = 0; i < n; i++){
        M[i][0] = rand() % (n*m);
    }
    printf("\n Output matrix with an additional column A[%d][%d]:\n", n, m);
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < C1; j++)
            printf(" %4d ", M[i][j]);
        printf("\n");
    }
    return;
}
READ ALSO
C++ классы, преобразовать программу

C++ классы, преобразовать программу

Был код, калькулятор римских и арабских чиселНужно его преобразовать, чтобы был в 3 файла main

220
expected primary-expression before &#39;*&#39; token

expected primary-expression before '*' token

Добрый день, подскажите пожалуйста, что я делаю не так? Хочу создать структуру из двух байтов и указателя на функцию, прикомпиляции выдает...

215
Ошибка в работе деструктора

Ошибка в работе деструктора

Помогите пожалуйста разобраться в данной ошибкеСам еще только учусь, поэтому потратил большое количество времени, пытаясь разобраться в этом

219
Подключение *.pas файла к проекту в C++ Builder

Подключение *.pas файла к проекту в C++ Builder

Имеется проект в C++ Builder, также имеется файл форматаpas содержащий довольно большое количество нужного кода

172