为什么这打破了程序?(我在c)tablero =(int*)malloc(sizeof(int)*fil*col);

  • 本文关键字:int tablero malloc col fil sizeof 我在 程序 c
  • 更新时间 :
  • 英文 :


所以...我正在参加河内塔计划,这打破了整个事情...请您帮助我吗?这是我的第一个问题,我真的不知道这是如何工作的:(在主函数中宣布" tablero"时会破裂

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void imprime(int *tab, int fil, int col, int ultNum, char name[64], char caso, int count, int filOrig, int filDest) {
    /*
    Precondición:
     *tab   Puntero a una matriz de tipo entero.
                                    fil     Entero que indica el numero de filas de la matriz.
                                    col     Entero que indica el numero de columnas de la matriz.
                                    disc    Parámetro de tipo entero que indica el numero de discos usados.
                                    ultNum  Entero que indica el numero que esta usando el disco mas grande.
     */FILE *f;
    switch (caso) {
        case 119:
            f = fopen(name, "w");
            break;
        case 97:
            f = fopen(name, "a");
            break;
        default:
            printf("no file");
            break;
    };
    int j, c;
    int i, esp;
    printf("Move %d to %d, movement number %d n", filOrig, filDest, count);
    for (c = col - 1; c >= 0; c--) {
        for (j = 0; j < fil; j++) {
            esp = (ultNum - tab[col * j + c]) / 2;
            // Espacios a la izquierda
            for (i = 0; i < esp; i++) {
                fprintf(f, " ");
                printf(" ");
            };
            // Imprime los comodines
            for (i = 0; i < tab[col * j + c]; i++) {
                fprintf(f, "*");
                printf("*");
            };
            // Espacios a la derecha
            for (i = 0; i < esp; i++) {
                fprintf(f, " ");
                printf(" ");
            }
            fprintf(f, "t");
            printf("t");
        };
        fprintf(f, "rn");
        printf("n");
    };

    printf("n n n n n");
    fprintf(f, " rn rn rn rn rn ");
    fclose(f);
    count++;
};
void mueveDisco(int *tab, int fil, int col, int ultNum, int filOrig, int filDest, char name[64], char caso, int count) {
    /*
    Precondición:
     *tab   Puntero a una matriz de tipo entero.
                                    fil     Entero que indica el numero de filas de la matriz.
                                    col     Entero que indica el numero de columnas de la matriz.
                                    disc    Parámetro de tipo entero que indica el numero de discos usados.
                                    ultNum  Entero que indica el numero que esta usando el disco mas grande.
                                    filOrig Entero que indica el numero de fila de la matriz en la cual hay que coger el numero/disco
                                    filDest Entero que indica el numero de fila de la matriz en la cual hay que dejar el numero/disco.
    Poscondición:
                                    Se mueve el disco y se llama a la función que imprime el tablero.
     */
    int cO = col - 1, cD = col - 1;

    // Se busca el disco que se encuentre mas arriba y por lo tanto el mas pequeño de la fila de origen.
    while (cO >= 0 && tab[col * filOrig + cO] == 0) {
        cO--;
    };
    if (cO < 0)
        cO = 0;
    // Ahora se calcula cual es la posición libre mas arriba de la fila de destino
    while (cD >= 0 && tab[col * filDest + cD] == 0) {
        cD--;
    };
    // Se mueve el disco de la fila de origen a la de destino:
    tab[col * filDest + cD + 1] = tab[col * filOrig + cO];
    tab[col * filOrig + cO] = 0;
    // Se imprime el tablero:
    imprime(tab, fil, col, ultNum, name, caso, count, filOrig, filDest);
};
void hanoi(int *tab, int fil, int col, int disc, int ultNum, int O, int A, int D, char name[64], char caso, int count) {
    /*
    Precondición:
     *tab   Puntero a una matriz de tipo entero.
                                fil     Entero que indica el numero de filas de la matriz.
                                col     Entero que indica el numero de columnas de la matriz.
                                disc    Parámetro de tipo entero que indica el numero de discos usados.
                                ultNum  Entero que indica el numero que esta usando el disco mas grande.
                                O,A,D   Tres enteros que indican la fila desde donde se ha de coger el disco y a donde se ha de traspasar. La primera vez que se llama a hanoi tienen los valores de: 0 ,1 y 2 respectivamente.
    Poscondición:
                                Se llama recursivamente a hanoi hasta resolver el tablero.
     */
    if (disc == 1) {
        // Se borra la pantalla, se imprime la tabla y se hace una pausa que varia dependiendo del numero de discos:
        mueveDisco(tab, fil, col, ultNum, O, D, name, caso, count);
        if (col <= 5) system("sleep 0.8");
        else if (col <= 10) system("sleep 0.3");
        else if (col <= 15) system("sleep 0.06");
        else if (col > 15) system("sleep 0.02");
    } else {
        hanoi(tab, fil, col, disc - 1, ultNum, O, D, A, name, caso, count);
        mueveDisco(tab, fil, col, ultNum, O, D, name, caso, count);
        if (col <= 5) system("sleep 0.8");
        else if (col <= 10) system("sleep 0.3");
        else if (col <= 15) system("sleep 0.06");
        else if (col > 15) system("sleep 0.02");
        hanoi(tab, fil, col, disc - 1, ultNum, A, O, D, name, caso, count);
    };
};
int main(int argc, char *argv[]) {
    int k; /* Value for the "-q" optional argument. */
    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    char s[64];
    strftime(s, sizeof (s), "%c", tm);
    printf("%sn", s);
    char name[64];
    int fil = 3, col = 3, *tablero = NULL;
    int j, c, disc = 1, ultNum;
    int count = 0;
    char caso;
    int i;
    /*
        printf("Escoja nombre del fichero :");
        scanf("%s", &name);
        printf( "Indique el numero de discos: " );
        scanf( "%i", &col );
        printf("Seleccione operacion en fichero: n1. Añadir texto al archivon2. Reescribir archivo si existen3. No imprimir en archivon");
        scanf ("%d", &caso);
     */
    for (i = 0; i < argc; i++) {
        if (strcmp(argv[i], "-d") == 0) {
            col = atoi(argv[i + 1]);
        }
        if (strcmp(argv[i], "-f") == 0) {
            sprintf(name, "%s.txt", argv[i + 1]);
        }
        if (strcmp(argv[i], "-o") == 0) {
            caso = argv[i + 1];
        }
    }
    printf("hace el forn");
    FILE *f;
    printf("hace el filen");
    switch (caso) {
        case 119:
            f = fopen(name, "w");
            printf("escribí la wn");
            break;
        case 97:
            f = fopen(name, "a");
            printf("escribi la an");
            break;
        default:
            printf("no filen");
            break;
    };
    printf("hace el switchn");
    tablero = (int *) malloc(sizeof (int)*fil * col); //peta aqui
    printf("hice el sizeof");
    // Resetea las torres poniendo "los discos" en una de ellas y 0 en el resto.
    for (j = 0; j < fil; j++)
        for (c = col - 1; c >= 0; c--)
            if (j == 0) {
                tablero[col * j + c] = disc;
                disc += 2;
            } else
                tablero[col * j + c] = 0;
    ultNum = disc;
    fprintf(f, " Comand line entered: rn Number of towers : %d nn Number of discs:  : %d nn Output filename   : %s rn rn Init time        : %s rn rn rn", fil, col, name, s);
    fclose(f);
    printf(" n n Comand line entered: n Number of towers : %d n Number of discs:    : %d n Output filename : %s n n Init time        : %s n n n", fil, col, name, s);
    // Se imprime el tablero antes de iniciar ningún movimiento:
    system("clear");
    imprime(tablero, fil, col, ultNum, name, caso, count, 0, 0);
    system("sleep 1");

    // Se llama a hanoi para comenzar "la partida":
    hanoi(tablero, fil, col, col, ultNum, 0, 1, 2, name, caso, count);
    f = fopen(name, "a");
    fprintf(f, " rn rn Fin Time : %s", s);
    fclose(f);
    return (0);
};

尚不清楚您的意思是什么,如果是汇编错误,那么这与该特定行无意义,因为已经存在其他错误防止代码构建。

如果是运行时错误(运行时会崩溃),则没有任何意义,因为代码未构建。

编写特定行的更好方法是:

tablero = malloc(fil * col * sizeof *tablero);

这个

  • 避免malloc()的返回值的演员
  • 在目标指针上使用sizeof,避免重复该类型

最新更新