Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Ошибка при выделении памяти (http://forum.oszone.net/showthread.php?t=297783)

alexprom65 01-04-2015 15:48 2490455

Ошибка при выделении памяти
 
Доброго времени суток. Пишу программу, удаляющую строки из двумерного массива, в которых есть хотя бы один локальный максимум (элемент, больший всех своих соседей). Но программа крашится уже на этапе выделения памяти. Ввожу количество строк, потом столбцов, и происходит слёт. С фиксированной памятью работает, хоть и не удаляет строки. А мне нужна программа, работающая именно с динамической памятью. Подскажите студенту, пожалуйста. Вроде, элементарная задачка, но уже вызывает столько проблем.
Код:

#include <stdio.h>
#include <stdlib.h>
int del (int **a, int m, int n)
{
        int h, i, j, l, k;
        k=0;
        int *b=(int*)malloc(m*sizeof(int));
        if (b==NULL)
                        printf("\nCan't create massive");
        for(i=0;i<m;i++)
        {
                h=0;
                if(i==m-1)
                {
                        for(j=0;j<n;j++)
                                        if (j==n-1)
                                                {
                                                        if(a[i][j]>a[i][j-1] && a[i][j]>a[i-1][j])
                                                                h++;
                                                }
                                        else
                                        switch (j)
                                        {
                                                case (0):
                                                {
                                                        if(a[i][j]>a[i][j+1] && a[i][j]>a[i-1][j])
                                                                h++;
                                                        break;
                                                }
                                                default:
                                                {
                                                        if(a[i][j]>a[i][j+1] && a[i][j]>a[i-1][j] && a[i][j]>a[i][j-1])
                                                                h++;
                                                        break;
                                                }
                                        }
                                        if(h!=0)
                                        {
                                                b[k]=i;
                                                k++;
                                        }
                }
                else
                switch (i)
                {
                        case (0):
                                {
                                        for(j=0;j<n;j++)
                                        if (j==n-1)
                                                {
                                                        if(a[i][j]>a[i][j-1] && a[i][j]>a[i+1][j])
                                                                h++;
                                                        break;
                                                }
                                        else
                                        switch (j)
                                        {
                                                case (0):
                                                {
                                                        if(a[i][j]>a[i][j+1] && a[i][j]>a[i+1][j])
                                                                h++;
                                                        break;
                                                }
                                                default:
                                                {
                                                        if(a[i][j]>a[i][j+1] && a[i][j]>a[i+1][j] && a[i][j]>a[i][j-1])
                                                                h++;
                                                        break;
                                                }
                                        }
                                        if(h!=0)
                                        {
                                                b[k]=i;
                                                k++;
                                        }
                                        break;
                                }
                        default:
                                {
                                        for(j=0;j<n;j++)
                                        if (j==n-1)
                                                {
                                                        if(a[i][j]>a[i][j-1] && a[i][j]>a[i+1][j] && a[i][j]>a[i-1][j])
                                                                h++;
                                                }
                                        else
                                        switch (j)
                                        {
                                                case (0):
                                                {
                                                        if(a[i][j]>a[i][j+1] && a[i][j]>a[i+1][j] && a[i][j]>a[i-1][j])
                                                                h++;
                                                        break;
                                                }
                                                default:
                                                        if(a[i][j]>a[i][j+1] && a[i][j]>a[i+1][j] && a[i][j]>a[i-1][j] && a[i][j]>a[i][j-1])
                                                                h++;
                                                        break;
                                        }
                                        if(h!=0)
                                        {
                                                b[k]=i;
                                                k++;
                                        }
                                        break;
                                }
                }
        }
        for(l=0;l<k;l++)
        {
                for(i=b[l];i<m-1;i++)
                        for(j=0;j<n;j++);
                                a[i][j]=a[i+1][j];
                free (a[m-1]);
                m--;
        }
        free (b);
}

int main()
{
        int i, j, m, n;
        int **a;
        printf("Type number of strings: ");
        scanf("%d", m);
        printf("\nType number of columns: ");
        scanf("%d", n);
        a=(int**)malloc(m*sizeof(int*));
        if(a==NULL)
                printf("\nERROR");
        for(i=0;i<m;i++)
        a[i]=(int*)malloc(n*sizeof(int));
        if(a==NULL)
                printf("\nERROR");
        printf("\nType elements of matrix:\n");
        for(i=0;i<m;i++)
        for(j=0;j<n;j++)
        scanf("%d", &a[i][j]);
        for(i=0;i<m;i++)
        {
                printf("\n");
                for(j=0;j<n;j++)
                printf("%d", a[i][j]);
        }
        del(a,m,n);
        printf("\nResult is\n");
        for(i=0;i<m;i++)
        {
                printf("\n");
                for(j=0;j<n;j++)
                printf("%d", a[i][j]);
        }
        for(i=0;i<m;i++)
        free (a[i]);
        free (a);
        getch();
        return 0;
}



Время: 06:01.

Время: 06:01.
© OSzone.net 2001-