Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    3

    [C] probabile problema con realloc!

    Salve! Non mi sembra di aver visto la sezione delle presentazioni quindi nel caso mi scuso in anticipo sto cercando di risolvere un esercizio che prevede l'inserimento da tastiera di linee e la loro concatenazione. Il problema sta quando vado a riallocare temp nel main la seconda volta. Non riesco a capire dove sbaglio. Qualcuno potrebbe illuminarmi?

    codice:
    #include <stdlib.h>#include <stdio.h>
    #include <string.h>
    
    
    int const DIM=20;
    
    
    void fillS(char*, int);
    
    
    int main(int argc, char *argv[]){
    
    
        char *str, *temp, c;
        int dim=DIM, dimS;
    
    
        str=(char*)malloc(dim*sizeof(char));
        *str='\0';
    
    
        temp=(char*)malloc(dim*sizeof(char));
    
    
        while(1){
    
    
            printf("Vuoi inserire una nuova stringa?");
            if((c=getchar())!='y') break;
            fflush(stdin);
    
    
            fillS(temp, dim);
            printf("temp: %s\n", temp);
    
    
            dimS+=(strlen(temp)+1);
    
    
            str=(char*)realloc(str, dimS*sizeof(char));
    
    
            strcat(str, temp);
            printf("str: %s\n", str);
    
    
            strcat(str, " ");
    
    
        }
    
    
        printf("Il risultato e':\n%s\n", str);
    
    
    
    
    }
    
    
    void fillS(char *str, int dim){
    
    
        int i=0;
        char c;
    
    
        while((c=getchar())!='\n'){
    
    
            if(i==dim){
    
    
                    str=(char*)realloc(str, (dim+=dim)*sizeof(char));
    
    
                    printf("controllo\n");
    
    
    
    
    
    
            }
    
    
            *(str+i)=c;
            i++;
    
    
        }
    
    
        *(str+i)='\0';
    
    
        str=(char*)realloc(str, (strlen(str)+1)*sizeof(char));
    
    
    }

  2. #2
    Forse l'errore è che non allochi lo spazio necessario per lo spazio che aggiungi in coda a str ?
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Io credo che il problema tu ce l'abbia nel while((c=getchar())!='\n').
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    3
    @Samuele_70
    No :/ se ti riferisci a str nel main, con temp più piccoli str va a reallocarsi e a concatenarsi correttamente. e anche quando un temp più grande di DIM viene acquisito da tastiera in maniera errata str si realloca e si concatena correttamente.
    Nello str della funzione fillS può darsi. Solo che non capisco perché il problema a questo punto si verifica solo dalla seconda iterazione in poi.

    @infinitejustice
    perché?

  5. #5
    Riguardando il codice, noto che la varibile dimS non è inizializzata a 0 come dovrebbe.

    Poniamo il caso che temp contenga "a"
    con
    dimS+=(strlen(temp)+1);

    dimS varrà 2

    dopo
    str=(char*)realloc(str, dimS*sizeof(char));

    str sarà lunga 2 caratteri (str[0] = 'a', str[1] = '\0' tutto ok)

    peccato che alla fine del ciclo accodi un'altro carattere per cui però non avevamo previsto l'allocazione
    strcat(str, " ");
    quindi avremo :
    str[0] = 'a', str[1] = ' ' ed il terminatore verrà scritto su str[2], ovvero in un'area di memoria non allocata, che verrà sosvrascritta alla prima occasione.

    Edit:
    Ti consiglio però di rivedere tutta la logica del codice, così com'è è eccessivamente complicato.
    Dovresti delegare tutta la gestione della memoria e dell'input alla funzione fillS(), preoccupandoti di passargli il solo puntatore a str (inizializzato a NULL, la prima volta)
    Ultima modifica di Samuele_70; 18-01-2015 a 13:08
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  6. #6
    Aggiungo qualche altra considerazione, l'ultima realloc() nella funzione fillS() è praticamente inutile, e soprattutto non vedo nessuna chiamata alla funzione free() per liberare la memoria allocata.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    3
    Quote Originariamente inviata da Samuele_70 Visualizza il messaggio
    Aggiungo qualche altra considerazione, l'ultima realloc() nella funzione fillS() è praticamente inutile, e soprattutto non vedo nessuna chiamata alla funzione free() per liberare la memoria allocata.
    Sì non hai tutti i torti xD ho rimediato aggiungendo free(temp) alla fine del ciclo while nel main. Comunque se provo a passare temp inizializzato a null come parametro esplicito e ad allocarlo stesso nella funzione ho problemi anche con il primo ciclo. Per quanto riguarda quel dimS in realtà l'ho inizializzato a DIM anche quello. Lì stavo facendo delle prove e ho scordato di correggerlo, errore mio ^^"

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.