Allocazione dinamica di una matrice

di il
3 risposte

Allocazione dinamica di una matrice

Ciao,
stavo scrivendo un programma e sto avendo dei problemi con l'uso di malloc per allocare una matrice.
Vorrei utilizzare una funzione che ritorni il puntatore al puntatore in modo da non dover passare il puntatore al puntatore per reference.

La funzione dovrebbe leggere la prima riga di un file su cui sono presenti due numeri che rappresentano numero di righe e colonne della matrice.
La matrice, in memoria, è definita di tipo point_t, perché poi ho bisogno di modificare alcuni caratteri e non voglio perdere "l'originale".

La funzione
point_t** ReadFile(FILE *fin, int *r, int *c)
riceve il file da cui deve leggere i numeri e i puntatori r e c, in cui va a mettere tali numeri, in modo che siano accessibili dal main.

Dovrebbe poi allocare un vettore di puntatori a variabili di tipo type_t.
Le singole celle del vettore sono quindi poi allocate con un altro malloc.

Lo schema dovrebbe essere

**point_t ********************** *point_t *********************** point_t
m --------------------------------> [ m ] -------------------------------->[ m[j] ][ ][ ][ ][ ]
**************************************[****** ] ------> ...
**************************************[****** ] ...
**************************************[****** ]

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

typedef struct Point{
int key;
int color;
} point_t;

point_t ** ReadFile(FILE *fin, int* r, int* c);

int main(void)
{
    point_t** m;
    int r, c, i;
    FILE *fin;

    fin = fopen("file1.txt", "r");
    if (fin == NULL)
    {
        printf("Unable to open input file.\n");
        exit(1);
    }

    m = ReadFile(fin, &r, &c);

}

point_t** ReadFile(FILE *fin, int *r, int *c)
{
    int i, j;
    char temp;
    point_t** ml;

    fscanf(fin, "%d %d", r, c);

    ml = (point_t**) malloc(sizeof(point_t*) * (*r));
    if(ml == NULL)
    {
        printf("Unable to allocate memory.\n");
        exit(1);
    }

    for(i = 0; i < r; i++)
    {
        ml[i] = (point_t*) malloc((sizeof(point_t)*(*c)));
        if (ml[i] == NULL)
        {
            printf("Unable to allocate memory.\n");
            exit(1);76<
        }
    }
    
    return ml;
}
Dove sbaglio?
Il compilatore compila correttamente, ma il programma "smette di funzionare" e il debugger dà Segmentation Fault al primo malloc.

Grazie

3 Risposte

Devi accedere o registrarti per scrivere nel forum
3 risposte