PDA

Visualizza la versione completa : [C] Malloc e allocazione memoria per puntatore a caratteri


^EvAmPiReS^
20-05-2006, 17:19
void delmanipulate (char *s) {

FILE *ptrdel;

int i = 0, j = 4, k = 0, x = 0, e = 0, n = 0;

char *del,*control;

char **mat;

n = stringcounter(s);

mat = (char **)malloc(n * sizeof(char));

for(x=0;x<n;x++)

mat[x] = (char*)malloc(STREAM*sizeof(char));

del = (char*)malloc(STREAM*sizeof(char));

control = (char*)malloc(STREAM*sizeof(char));

ptrdel = fopen("results.txt","r");

if(ptrdel==NULL) {

printf("Errore nell'apertura del file\n\n");

exit(0);
}

while(j<=STREAM) {

if(s[j]=='+' || j==STREAM) {

del[i]='\0';

break;
}

del[i]=s[j];

j++;

i++;
}

i=0;

while((e=fgetc(ptrdel))!= EOF) {

if(((char)e) == '\0') {

control[i]='\0';

if((strcmp(control,del)) !=0) {

strcpy(mat[k],control);

i=0;

k++;

}

if((strcmp(control,del)) == 0) {

i=0;

}

}

if(e!=10 && ((char)e!='\0') && ((char)e!='\n')) {

control[i]=(char)e;

i++;
}
}

fclose(ptrdel);

ptrdel = fopen("results.txt","w+");

for(x=0;x<k;x++) {

fprintf(ptrdel,"%s",mat[x]);
fprintf(ptrdel,"%c",'\0');
fprintf(ptrdel,"%c",'\n');
}

fclose(ptrdel);
free(mat);
}


Compilando questo programma ricevo un bel Segmentation Fault, quando vado a scrivere sulla 3/4 riga della matrice. Ora i miei dubbi sono :
1 - Ho sbagliato l'utilizzo della malloc?
2- Devo inizializzare la matrice, riempendola con caratteri casuali?
3 -Se al posto della variabile 'n' nella malloc metto un numero grande dell'ordine di 30, il problema non si pone ed il programma viene eseguito :( perchè??!! :incupito:

P.S. La funzione stringcounter restituisce il numero di stringhe all'interno di un file di testo.

oregon
20-05-2006, 17:36
Se questa riga

mat = (char **)malloc(n * sizeof(char));

deve servire ad allocare un array di stringhe, allora deve essere

mat = (char **)malloc(n * sizeof(char *));

andbin
20-05-2006, 17:42
Originariamente inviato da ^EvAmPiReS^

mat = (char **)malloc(n * sizeof(char));Non mi è ben chiaro completamente cosa deve fare la tua funzione, comunque, così a prima vista, se con la prima malloc devi allocare un "array di stringhe", devi mettere sizeof(char*).

mat = (char **)malloc(n * sizeof(char*));

^EvAmPiReS^
20-05-2006, 18:29
Grazie mille ad entrambi ora va :yuppi:
Dovevo allocare la dimensione di un puntatore a char e non di un char giusto? :master:

oregon
20-05-2006, 18:42
Beh ... certo ...

^EvAmPiReS^
20-05-2006, 19:10
Per me ste cose non son scontate sto imparando :fighet:

oregon
20-05-2006, 19:37
Originariamente inviato da ^EvAmPiReS^
Per me ste cose non son scontate sto imparando :fighet:

Non l'ho messo in dubbio ...

^EvAmPiReS^
21-05-2006, 02:32
Che sto imparando o che son cose scontate? :confused:

Scherzo! :rollo: Stay relaxed. Grazie ancora. :ciauz: :ciauz:

Loading