Sto lavorando ad un progetto e ho bisogno di usare una matrice le cui dimensioni sono lunghezze di stringhe passate come parametri al main e quindi note solo a runtime.
Nel main alloco le stringhe, ne recupero la lunghezza e poi passo tutto a una funzione (le due stringhe (char*) più le lunghezze (int)).
Nella funzione ho dichiarato una matrice usando le lunghezze delle stringhe come dimensioni.
Tutto funzionava a dovere, fino a quando sono arrivato a dover usare stringhe di lunghezza > 2000 (per intenderci, sarebbero sequenze di DNA, quindi è logico che siano così lunghe). Con stringhe così lunghe ho ottenuto una bellissima segmentation fault.
Ne consegue che ho la necessità di allocare la matrice dinamicamente. Ho letto in giro un po' di modi, tra cui il più comune è il seguente:
Codice: Seleziona tutto
int **score, i;
// Allocazione righe
if ((score = malloc(len1*sizeof(int*))) == NULL)
return -1;
// Allocazione colonne
for(i=0; i<len1; i++) {
if ((score[i] = malloc(sizeof(int) * len2) == NULL)
return -1;
}
- È l'unico modo in cui posso allocare la matrice o è possibile farlo con un'unica malloc (con una conseguente unica free)?
- Più avanti accedo agli elementi della matrice nel modo usuale (score[j]); vorrei non dover cambiare tutto. Avrò problemi in tal senso con l'allocazione dinamica?
EDIT: la free sarebbe corretta in questo modo?
Codice: Seleziona tutto
for(i=0; i < len1; i++)
free(score[i]);
free(score);