Strutture e realloc

di il
5 risposte

Strutture e realloc

Salve a tutti, ho un problema con realloc. Allora ho una struttura di questo tipo:
struct elementi {
char *w;
};
poi prima alloco la memoria, e poi cerco di ampliarla ulteriormente, ma non riesco con realloc, mi da errore. Ecco una semplice parte di codice per far capire: Grazie cmq in anticipo per l'aiuto
struct elementi *I;

int i;

//prima allocazione di 10 elementi
I=(struct elementi *)malloc(10*sizeof(struct elementi));

//alloco poi ogni elemento w
for(i= 0; i<10; i++){
I[i].w = (char *)malloc(10*sizeof(char));
}

//realloco la struttura per ampliarla di 30 elementi
I =(struct elementi *)realloc(I, 30);

//alloco ora i nuovi elementi della struttura
for(i= 10; i<30; i++){
I[i].w = (char *)malloc(10*sizeof(char));
}

//la caricao tutta con il valore c
for(i= 0; i<30; i++)
strcpy(I[i].w, "c");

//vado a leggermi i valori
for(i= 0; i<30; i++)
printf("%s\n", I[i].w);

5 Risposte

  • Re: Strutture e realloc

    Allora, stai creando un vettore di 10 elementi che contengono una stringa di 10 caratteri l'uno = 10*10byte = 100 byte.

    La realloc che fai riduce a 30 i byte allocati per quello spazio di memoria...e cmq non ingrandisce quella esistente. Prova, invece a fare così: invece che

    //realloco la struttura per ampliarla di 30 elementi
    I =(struct elementi *)realloc(I, 30);


    fai

    //Ingrandisco il vettore I di 30 elementi
    int space = sizeof(I) + (30*sizeof(struct elementi));
    //realloco la struttura per ampliarla di 30 elementi
    I =(struct elementi *)realloc(I, space);

    Io non ho provato a verificare ... vedi un pò tu.
    Ciao
  • Re: Strutture e realloc

    Ok, ora va bene...errore mio!. Ora ne ho fatto un altra versione, cioè faccio la realloc nella funzione, va tutto bene(infatti stampo tutti i valori nella funzione) ma all'uscita di qeusta li perdo. Ti posto il codice che cosi si capisce di più:
    Prova ad eseguirlo e vedrai che stampa i valori della funzione, ma all'scita di questa segnala un errore nell'accesso ai dati della struttura
    struct elementi{
    	char *w;
    };
    
    
    void modifica(struct elementi *x)
    {
    	int i;
    	struct elementi *temp;
    	
    	//alloco ogni elemento della struttura e inserisco un valore
    	for (i = 0; i< 10; i++){
    		x[i].w = (char *)malloc(20*sizeof(char));
    		strcpy(x[i].w, "prima della realloc");
    	}
    	//realloco
    	temp = (struct elementi *)realloc(x, 20*sizeof(struct elementi));
    	if(temp != NULL){
    		x = temp;
    	}
    	
    	//alloco i nuovi elementi e inserisco un valore
    	for (i = 10; i< 20; i++){
    		x[i].w = (char *)malloc(20*sizeof(char));
    		strcpy(x[i].w, "dopo la realloc");
    	}
    	
    	//stampo i valori della struttura
    	for (i = 0; i< 20; i++){
    		printf("nella funzione == : %s\n", x[i].w);
    	}
    }
    
    int main(int argc, char *argv[])
    {
    
    	struct elementi *valore;
    	int i;
    	
    	valore = (struct elementi *)malloc(10*sizeof(struct elementi));
    	
    	modifica(valore);
    	
    	//stampo ora i valori fuori dalla funzione
    	for (i = 0; i< 20; i++){
    		printf("fuori la funzione == %s\n", valore[i].w);
    	}
    	
    
      return EXIT_SUCCESS;
    }
  • Re: Strutture e realloc

    
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    struct elementi{
       char *w;
    };
    
    
    void modifica(struct elementi **x)
    {
       int i;
       struct elementi *temp;
       
       //alloco ogni elemento della struttura e inserisco un valore
       for (i = 0; i< 10; i++){
          ((*x)[i]).w = (char *)malloc(20*sizeof(char));
          strcpy(((*x)[i]).w, "prima della realloc");
       }
       //realloco
       temp = (struct elementi *)realloc(*x, 20*sizeof(struct elementi));
       if(temp != NULL){
          *x = temp;
       }
       
       //alloco i nuovi elementi e inserisco un valore
       for (i = 10; i< 20; i++){
          ((*x)[i]).w = (char *)malloc(20*sizeof(char));
          strcpy(((*x)[i]).w, "dopo la realloc");
       }
       
       //stampo i valori della struttura
       for (i = 0; i< 20; i++){
          printf("nella funzione == : %s\n", ((*x)[i]).w);
       }
    }
    
    int main(int argc, char *argv[])
    {
    
       struct elementi *valore;
       int i;
       
       valore = (struct elementi *)malloc(10*sizeof(struct elementi));
       
       modifica(&valore);
       
       //stampo ora i valori fuori dalla funzione
       for (i = 0; i< 20; i++){
          printf("fuori la funzione == %s\n", valore[i].w);
       }
       
    
      return EXIT_SUCCESS;
    }
    
    Non ti funzionava perché tu passavi alla funzione modifica il valore contenuto in "valore" ovvero l'indirizzo della prima entry dell'array creato, quindi nello stack di "modifica" la variabile x conteneva tale valore, ora quando effettuavi la realloc l'indirizzo restituito in temp lo assegnavi alla variabile x, pensando che la modifica si ripercuotesse anche su "valore", ma la variabile "valore" non viene modificata, in quanto sono in record di attivazione diversi.

    Nel codice che ti postato, ho fatto in modo di passare a "modifica" l'indirizzo della variabile "valore", in modo tale che dalla funzione "modifica" mediante deriferimento riesca effettivamente a modificare il contenuto della memoria relativa alla variabile "valore".

    Spero di essere stato chiaro, ciao
  • Re: Strutture e realloc

    Perfetto!!! ora ho capito tutto! io pensavo che passando "modifica(valore) io stessi passando l'indirizzo (come si fa con gli array) della struttura!. cmq ora ho capito. un ultima cosa, scrivere ((*x)).w equivale a scrivere (*x).x giusto?

    grazie cmq.
  • Re: Strutture e realloc

    welfi ha scritto:


    perfetto!!! ora ho capito tutto! io pensavo che passando "modifica(valore) io stessi passando l'indirizzo (come si fa con gli array) della struttura!. cmq ora ho capito. un ultima cosa, scrivere ((*x)).w equivale a scrivere (*x).x giusto?

    grazie cmq.


    Si, puoi toglierle quelle parentesi, io le avevo messe per sicurezza

    ciao
Devi accedere o registrarti per scrivere nel forum
5 risposte