Can';二维动态阵列的t自由存储器

Can';二维动态阵列的t自由存储器,c,multidimensional-array,free,dynamic-memory-allocation,C,Multidimensional Array,Free,Dynamic Memory Allocation,我在释放记忆方面有问题。我做了很多次,效果很好。现在,它只是停止工作(没有错误,任何东西,只是冻结) 我的代码是什么样子的: void args(int argc, char** argv, int *n, int *m, int **matrix, char name[20]) { int firstIter = TRUE; int x; char op; int** second; second = NULL; op = argv[1][0]; for (x = 2; x < a

我在释放记忆方面有问题。我做了很多次,效果很好。现在,它只是停止工作(没有错误,任何东西,只是冻结)

我的代码是什么样子的:

void args(int argc, char** argv, int *n, int *m, int **matrix, char name[20])
{
int firstIter = TRUE;
int x;
char op;
int** second;

second = NULL;

op = argv[1][0];

for (x = 2; x < argc; x++)
{
    if (!firstIter)
    {
        setName(name, argv[x]);
        loadMatrix(*m, *n, second, *name);
        opMatrix(*m, *n, matrix, second, &*matrix, op);
    }
    else
    {
        setName(name, argv[x]);
        loadSizeMatrix(n, m, name);

        matrix = (int **)malloc(*n * sizeof(int*));
        for (int i = 0; i < *n; i++) {
            matrix[i] = (int *)malloc(*m * sizeof(int));
        }

        second = (int **)malloc(*n * sizeof(int*));
        for (int i = 0; i < *n; i++) {
            second[i] = (int *)malloc(*m * sizeof(int));
        }

        loadMatrix(*m, *n, matrix, *name);
        firstIter = FALSE;
    }
}

printMatrix(*m, *n, matrix);

for (int i = 0; i < *n; i++) {
    free(second[i]);
}

free(second[0]); //doesnt work too, and yes, there are data

free(second);
}
void args(int-argc,char**argv,int*n,int*m,int**matrix,char-name[20])
{
int firstIter=TRUE;
int x;
char op;
整数**秒;
第二个=空;
op=argv[1][0];
对于(x=2;x
第二个是这样填写的(loadMatrix):

for(int c=0;c
如何解决此错误

我的完整代码

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <ctype.h> //tolower
#include <string.h>

#define TRUE 1
#define FALSE !TRUE

/* konstanty */
const enum {
    MAX_DELKA_SOUBORU = 10000,
    MAX_SOUBOR = 20
}; 

const enum {
    SOUBOR_NENALEZEN = 1,
    SPATNE_ARGUMENTY = 2,
    LIMIT_NAZEV_SOUBOR = 3,
    SPATNY_OP = 4
};

void error(int type);
void zpracovaniArgumentu(int argc, char** argv, char(*nazevSouboru)[MAX_SOUBOR], char(*nazevVystupni)[MAX_SOUBOR], int *n, int *m, int **matice);
void setNazevSouboru(char(*nazev)[MAX_SOUBOR], char *argument);
void vypisMatice(int radky, int sloupce, int **matice);
int nacteniMaticeZeSouboru(int radky, int sloupce, int **matice, char nazev[MAX_SOUBOR]);
int nacteniVelikostiMatice(int *n, int *m, char nazev[MAX_SOUBOR]);
int operaceMatic(int radky, int sloupce, int **prvni, int **druha, int **vysledek, char op);

int main(int argc, char** argv)
{
    int n, m; // n = sloupce, m = radky pro prvni matici
    int** first;
    char nazevSouboru[MAX_SOUBOR], nazevVystupni[MAX_SOUBOR];
    char op;

    first = NULL;

    zpracovaniArgumentu(argc, argv, &nazevSouboru, &nazevVystupni, &n, &m, &*first);

    /* for (int i = 0; i < m; i++) {
        free(first[i]);
    } */
    free(first);

    system("pause");
    return 0;
}

void error(int type)
{
    switch (type) 
    {
    case SOUBOR_NENALEZEN:  printf("Soubor nenalezen!");
        break;
    case SPATNE_ARGUMENTY:  printf("Program spustte s argumenty [nazev souboru] *[nazev vystupniho souboru]*.\n");
        break;
    case MAX_DELKA_SOUBORU: printf("Prekrocen maximalni limit delky nazvu souboru (%i).\n", MAX_SOUBOR);
        break;
    case SPATNY_OP:         printf("Program spustte s argumenty [nazev souboru] *[nazev vystupniho souboru]*.\n");
        break;
    default:                printf("Nastala chyba!");
        break;
    }
    system("pause");
    exit(type);
}


void zpracovaniArgumentu(int argc, char** argv, char(*nazevSouboru)[MAX_SOUBOR], char(*nazevVystupni)[MAX_SOUBOR], int *n, int *m, int **matice)
{
    int firstIter = TRUE;
    int doSouboru = FALSE;
    int x;
    char op;
    int** second;

    second = NULL;

    op = argv[1][0];

    for (x = 2; x < argc; x++)
    {
        if (!firstIter)
        {
            setNazevSouboru(nazevSouboru, argv[x]);
            nacteniMaticeZeSouboru(*m, *n, &*second, *nazevSouboru);
            operaceMatic(*m, *n, matice, &*second, &*matice, op);
        }
        else if (argv[x][0] == '-')
        {
            switch (argv[x][1])
            {
            case 'n':   doSouboru = TRUE;
                break;
            default:    error(SPATNE_ARGUMENTY);
                break;
            }
        }
        else if (doSouboru)
        {
            setNazevSouboru(nazevVystupni, argv[x]);
        }
        else
        {
            setNazevSouboru(nazevSouboru, argv[x]);
            nacteniVelikostiMatice(n, m, *nazevSouboru);

            matice = (int **)malloc(*n * sizeof(int*));
            for (int i = 0; i < *n; i++) {
                matice[i] = (int *)malloc(*m * sizeof(int));
            }

            second = (int **)malloc(*n * sizeof(int*));
            for (int i = 0; i < *n; i++) {
                second[i] = (int *)malloc(*m * sizeof(int));
            }

            nacteniMaticeZeSouboru(*m, *n, &*matice, *nazevSouboru);
            firstIter = FALSE;
        }
    }

    vypisMatice(*m, *n, matice);

    for (int i = 0; i < *n; i++) {
        printf("%i",second[i]);
        free(second[i]);
    }

    free(second);
}


void setNazevSouboru(char(*nazev)[MAX_SOUBOR], char *argument)
{
    strcpy(*nazev, argument);
    strcat(*nazev, ".txt"); //nazev souboru
}

int nacteniVelikostiMatice(int *n, int *m, char nazev[MAX_SOUBOR]) 
{
    FILE *fp = fopen(nazev, "r"); // načtení souboru
    int c;
    int radky = 1;
    int sloupce = 0;
    if (!fp) 
    {
        error(SOUBOR_NENALEZEN);
        exit(2);
    }
    else 
    {
        while ((c = fgetc(fp)) != EOF) 
        {
            //tolower(c);
            if (c == '\n') 
            {
                radky++;
            }
            else if ((isdigit(c)) && (radky == 1)) 
            {
                sloupce++;
            }
        }
    }
    fclose(fp);
    *n = sloupce;
    *m = radky;
    return 0;
}

int nacteniMaticeZeSouboru(int radky, int sloupce, int **matice, char nazev[MAX_SOUBOR]) 
{
    int x;

    FILE *fp = fopen(nazev, "r"); // načtení souboru
    if (!fp)
    {
        error(SOUBOR_NENALEZEN);
        exit(2);
    }
    else
    {
        for (int c = 0; c < radky; c++) {
            for (int d = 0; d < sloupce; d++) {
                fscanf(fp, "%i", &matice[c][d]);
                // printf("%i", matice[c][d]); // dump
            }
        }
    }
    fclose(fp);
    return 0;
}

int operaceMatic(int radky, int sloupce, int **prvni, int **druha, int **vysledek, char op)
{
    int vysledekClip[10][10];

    for (int c = 0; c < radky; c++) {
        for (int d = 0; d < sloupce; d++) {
            switch (op) {
                case '+':   vysledekClip[c][d] = prvni[c][d] + druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d]; 
                            break;
                case '-':   vysledekClip[c][d] = prvni[c][d] - druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d];
                            break;
                case '/':   vysledekClip[c][d] = prvni[c][d] / druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d];
                            break;
                case '%':   vysledekClip[c][d] = prvni[c][d] % druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d];
                            break;
                case '*':   vysledekClip[c][d] = prvni[c][d] * druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d];
                            break;
                default:    error(SPATNY_OP);
                            break;
            }
            vysledek[c][d] = vysledekClip[c][d];
        }
    }

    return 0;
}

void vypisMatice(int radky, int sloupce, int **matice)
{
    int c;
    int d;
    for (c = 0; c < radky; c++) {
        for (d = 0; d < sloupce; d++) {
            printf("%i\t", matice[c][d]);
        } printf("\n");
    }
}

void vypisMaticeDoSouboru(int radky, int sloupce, int **matice, char nazevSouboru[MAX_DELKA_SOUBORU])
{
    int c;
    int d;
    for (c = 0; c < radky; c++) {
        for (d = 0; d < sloupce; d++) {
            printf("%i\t", matice[c][d]);
        } printf("\n");
    }
}
#包括
#包括
#包括
#包括//tolower
#包括
#定义真1
#定义错误!真的
/*康斯坦蒂*/
常量枚举{
最大值=10000,
最大苏博尔=20
}; 
常量枚举{
SOUBOR_NENALEZEN=1,
SPATNE_ARGUMENTY=2,
极限值_NAZEV_SOUBOR=3,
SPATNY_OP=4
};
无效错误(int类型);
无效zpracovaniArgumentu(内部argc,字符**argv,字符(*nazevSouboru)[MAX\u SOUBOR],字符(*nazevystupni)[MAX\u SOUBOR],内部*n,内部*m,内部**matice);
void setNazevSouboru(char(*nazev)[MAX_SOUBOR],char*参数);
void vypisMatice(内部拉德基、内部斯劳普切、内部**matice);
内纳克特尼马蒂塞泽苏博鲁(内拉德基、内斯劳普塞、内**马蒂塞、查尔纳泽夫[MAX_SOUBOR]);
int-nacteniVelikostiMatice(int*n,int*m,char-nazev[MAX_SOUBOR]);
内部操作(内部radky、内部sloupce、内部**prvni、内部**druha、内部**vysledek、内部操作);
int main(int argc,字符**argv)
{
int n,m;//n=sloupce,m=radky-pro-prvni-matici
int**第一;
char nazevSouboru[MAX_SOUBOR],nazevVystupni[MAX_SOUBOR];
char op;
第一个=空;
zpracovaniArgumentu(argc、argv、nazevSouboru、nazevVystupni、n、m和*第一);
/*for(int i=0;i#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <ctype.h> //tolower
#include <string.h>

#define TRUE 1
#define FALSE !TRUE

/* konstanty */
const enum {
    MAX_DELKA_SOUBORU = 10000,
    MAX_SOUBOR = 20
}; 

const enum {
    SOUBOR_NENALEZEN = 1,
    SPATNE_ARGUMENTY = 2,
    LIMIT_NAZEV_SOUBOR = 3,
    SPATNY_OP = 4
};

void error(int type);
void zpracovaniArgumentu(int argc, char** argv, char(*nazevSouboru)[MAX_SOUBOR], char(*nazevVystupni)[MAX_SOUBOR], int *n, int *m, int **matice);
void setNazevSouboru(char(*nazev)[MAX_SOUBOR], char *argument);
void vypisMatice(int radky, int sloupce, int **matice);
int nacteniMaticeZeSouboru(int radky, int sloupce, int **matice, char nazev[MAX_SOUBOR]);
int nacteniVelikostiMatice(int *n, int *m, char nazev[MAX_SOUBOR]);
int operaceMatic(int radky, int sloupce, int **prvni, int **druha, int **vysledek, char op);

int main(int argc, char** argv)
{
    int n, m; // n = sloupce, m = radky pro prvni matici
    int** first;
    char nazevSouboru[MAX_SOUBOR], nazevVystupni[MAX_SOUBOR];
    char op;

    first = NULL;

    zpracovaniArgumentu(argc, argv, &nazevSouboru, &nazevVystupni, &n, &m, &*first);

    /* for (int i = 0; i < m; i++) {
        free(first[i]);
    } */
    free(first);

    system("pause");
    return 0;
}

void error(int type)
{
    switch (type) 
    {
    case SOUBOR_NENALEZEN:  printf("Soubor nenalezen!");
        break;
    case SPATNE_ARGUMENTY:  printf("Program spustte s argumenty [nazev souboru] *[nazev vystupniho souboru]*.\n");
        break;
    case MAX_DELKA_SOUBORU: printf("Prekrocen maximalni limit delky nazvu souboru (%i).\n", MAX_SOUBOR);
        break;
    case SPATNY_OP:         printf("Program spustte s argumenty [nazev souboru] *[nazev vystupniho souboru]*.\n");
        break;
    default:                printf("Nastala chyba!");
        break;
    }
    system("pause");
    exit(type);
}


void zpracovaniArgumentu(int argc, char** argv, char(*nazevSouboru)[MAX_SOUBOR], char(*nazevVystupni)[MAX_SOUBOR], int *n, int *m, int **matice)
{
    int firstIter = TRUE;
    int doSouboru = FALSE;
    int x;
    char op;
    int** second;

    second = NULL;

    op = argv[1][0];

    for (x = 2; x < argc; x++)
    {
        if (!firstIter)
        {
            setNazevSouboru(nazevSouboru, argv[x]);
            nacteniMaticeZeSouboru(*m, *n, &*second, *nazevSouboru);
            operaceMatic(*m, *n, matice, &*second, &*matice, op);
        }
        else if (argv[x][0] == '-')
        {
            switch (argv[x][1])
            {
            case 'n':   doSouboru = TRUE;
                break;
            default:    error(SPATNE_ARGUMENTY);
                break;
            }
        }
        else if (doSouboru)
        {
            setNazevSouboru(nazevVystupni, argv[x]);
        }
        else
        {
            setNazevSouboru(nazevSouboru, argv[x]);
            nacteniVelikostiMatice(n, m, *nazevSouboru);

            matice = (int **)malloc(*n * sizeof(int*));
            for (int i = 0; i < *n; i++) {
                matice[i] = (int *)malloc(*m * sizeof(int));
            }

            second = (int **)malloc(*n * sizeof(int*));
            for (int i = 0; i < *n; i++) {
                second[i] = (int *)malloc(*m * sizeof(int));
            }

            nacteniMaticeZeSouboru(*m, *n, &*matice, *nazevSouboru);
            firstIter = FALSE;
        }
    }

    vypisMatice(*m, *n, matice);

    for (int i = 0; i < *n; i++) {
        printf("%i",second[i]);
        free(second[i]);
    }

    free(second);
}


void setNazevSouboru(char(*nazev)[MAX_SOUBOR], char *argument)
{
    strcpy(*nazev, argument);
    strcat(*nazev, ".txt"); //nazev souboru
}

int nacteniVelikostiMatice(int *n, int *m, char nazev[MAX_SOUBOR]) 
{
    FILE *fp = fopen(nazev, "r"); // načtení souboru
    int c;
    int radky = 1;
    int sloupce = 0;
    if (!fp) 
    {
        error(SOUBOR_NENALEZEN);
        exit(2);
    }
    else 
    {
        while ((c = fgetc(fp)) != EOF) 
        {
            //tolower(c);
            if (c == '\n') 
            {
                radky++;
            }
            else if ((isdigit(c)) && (radky == 1)) 
            {
                sloupce++;
            }
        }
    }
    fclose(fp);
    *n = sloupce;
    *m = radky;
    return 0;
}

int nacteniMaticeZeSouboru(int radky, int sloupce, int **matice, char nazev[MAX_SOUBOR]) 
{
    int x;

    FILE *fp = fopen(nazev, "r"); // načtení souboru
    if (!fp)
    {
        error(SOUBOR_NENALEZEN);
        exit(2);
    }
    else
    {
        for (int c = 0; c < radky; c++) {
            for (int d = 0; d < sloupce; d++) {
                fscanf(fp, "%i", &matice[c][d]);
                // printf("%i", matice[c][d]); // dump
            }
        }
    }
    fclose(fp);
    return 0;
}

int operaceMatic(int radky, int sloupce, int **prvni, int **druha, int **vysledek, char op)
{
    int vysledekClip[10][10];

    for (int c = 0; c < radky; c++) {
        for (int d = 0; d < sloupce; d++) {
            switch (op) {
                case '+':   vysledekClip[c][d] = prvni[c][d] + druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d]; 
                            break;
                case '-':   vysledekClip[c][d] = prvni[c][d] - druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d];
                            break;
                case '/':   vysledekClip[c][d] = prvni[c][d] / druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d];
                            break;
                case '%':   vysledekClip[c][d] = prvni[c][d] % druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d];
                            break;
                case '*':   vysledekClip[c][d] = prvni[c][d] * druha[c][d];
                            vysledek[c][d] = vysledekClip[c][d];
                            break;
                default:    error(SPATNY_OP);
                            break;
            }
            vysledek[c][d] = vysledekClip[c][d];
        }
    }

    return 0;
}

void vypisMatice(int radky, int sloupce, int **matice)
{
    int c;
    int d;
    for (c = 0; c < radky; c++) {
        for (d = 0; d < sloupce; d++) {
            printf("%i\t", matice[c][d]);
        } printf("\n");
    }
}

void vypisMaticeDoSouboru(int radky, int sloupce, int **matice, char nazevSouboru[MAX_DELKA_SOUBORU])
{
    int c;
    int d;
    for (c = 0; c < radky; c++) {
        for (d = 0; d < sloupce; d++) {
            printf("%i\t", matice[c][d]);
        } printf("\n");
    }
}
    second = (int **) malloc(*n * sizeof(int*));<p>
    for (int i = 0; i < *m; i++) {