Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Crash senza (apparente) motivo

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    
    int addspaces(char * dst, const char * src, int len);
    
    int main(void)
    {
        char str1[] = "Ciao!";
        char str2[] = "Come stai?";
        int tlen;
        if (strlen(str1) > strlen(str2))
        {
            tlen = strlen(str1);
        }
        else
        {
            tlen = strlen(str2);
        }
        tlen += 1; /* QUI! */
        char * dest1 = (char *) malloc(tlen * sizeof(char));
        char * dest2 = (char *) malloc(tlen * sizeof(char));
        if (!dest1 || !dest2)
        {
            printf("Errore nell'allocazione o.O\n\n");
            return 1;
        }
        if (!addspaces(dest1, str1, tlen) || !addspaces(dest2, str2, tlen))
        {
            printf("Errore nell'aggiunta degli spazi o.O o.O\n\n");
            free(dest1);
            free(dest2);
            return 2;
        }
    
        printf("%s  Ciao a te!\n", dest1);
        printf("%s  Bene!\n\n", dest2);
    
        free(dest1);
        free(dest2);
        return 0;
    }
    
    int addspaces(char * dst, const char * src, int len)
    {
        if (strlen(src) > len)
        {
            strncpy(dst, src, len);
            return 0;
        }
        if (strlen(src) == len)
        {
            strcpy(dst, src);
            return 2;
        }
        int spaces = len - strlen(src);
        int i;
        for (i = 0; i < spaces; i++)
        {
            dst[i] = ' ';
        }
        strncpy(&dst[i], src, len);
        return 1;
    }
    Il programma dovrebbe rendere le stringhe di lunghezza "len".

    Se passo come parametro la lunghezza della stringa più lunga tutto ok, se invece aumento la lunghezza di uno ("tlen += 1;"), per aggiungere praticamente uno spazio in più davanti a entrambe le stringhe, allora il programma stampa correttamente le stringhe e poi appare il classico messaggio di crash, la solita finestrella di Windows "Il programma ha smesso di funzionare".

    Mi sembra strano dato che comunque le stringhe le stampa .-.

    Dove sbaglio?

    EDIT: l'errore sembra essere causato dal 2° free... Ma perché??

  2. #2
    Non capisco molto la logica del tuo programmino (in sostanza che vuoi fare?) ma solitamente succede quando vai fuori memoria (buffer overflow) e poi liberi dello spazio con la free... oppure quando usi la free per spazi non allocati dalla malloc o costanti (ma non mi sembra questo il caso).

    Ripercorri per bene il codice e usa un Debugger per far meglio

    E' comunque normale che vedi la stringa e tutto perché hai temporaneamente usato una fetta di memoria usata non allocata, ma in C è lecito (ovvio, con queste conseguenze )
    CrystalSoft | Software House & Web Agency di WinRefine, Mercante in Fiera e altro...
    Annunci Zoo | Annunci gratuiti per il mondo degli Animali
    ElettroMercatino | Annunci a tema Informatico ed Elettronico

  3. #3
    Il programma aggiunge spazi bianchi all'inizio di una stringa fino a ottenerne una con una lunghezza prefissata...
    La cosa strana è che se diminuisco la lunghezza di uno (togliendo 'tlen += 1') funziona tutto!

  4. #4
    C'era un errorino logico sull'ultimo strncpy...

    Precisamente qua:
    codice:
    strncpy(&dst[ i], src, len);
    correggilo in:
    codice:
    strncpy(dst+i, src, strlen(src));
    Praticamente cercavi di copiare più caratteri di quelli che realmente la stringa doveva contenere poiché usavi la variabile len (che indica la dimensione massima di stringa) e non la dimensione della stringa sorgente...

    Inoltre ti consiglio per abbreviare, di usare la sintassi array + N per copiare dei caratteri su una posizione specifica di un puntatore
    Un array ricorda che è comunque un puntatore...

    EDIT: mi sono comunque accorto che a sto punto puoi usare direttamente la funzione strcpy al posto della strncpy
    CrystalSoft | Software House & Web Agency di WinRefine, Mercante in Fiera e altro...
    Annunci Zoo | Annunci gratuiti per il mondo degli Animali
    ElettroMercatino | Annunci a tema Informatico ed Elettronico

  5. #5
    Quello in teoria non è il problema, perché il terzo parametro di strncpy è il massimo dei caratteri da copiare... O mi sbaglio? o.O

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    In pratica lo è: len in quella funzione equivale a tlen+=1 in virtù dell'assegnameto che fai prima, per aggiungere (giustamente) un carattere in più alla chiamata a malloc().
    Quel +1, però, non deve propagarsi in giro.
    codice:
        char * dest1 = (char *) malloc( (tlen+1) * sizeof(char));
        char * dest2 = (char *) malloc( (tlen+1)* sizeof(char));
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Non è così ed aggiungere un + 1 non risolve di certo la soluzione, perché non è quello il problema...

    Da definizione:
    char * strncpy ( char * destination, const char * source, size_t num );

    Copy characters from string Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
    Significa che se parte la copia dal sesto carattere e dopo gli dici anche di copiare altri 11 caratteri ma la stringa ha un buffer di 11... va fuori memoria.
    Richiamando la free() viene liberata memoria e durante questa operazione verifica anche eventuali overflow.

    Se vogliamo essere pignoli, il + 1 può servire per un eventuale terminatore di stringa di cui non tieni conto.
    CrystalSoft | Software House & Web Agency di WinRefine, Mercante in Fiera e altro...
    Annunci Zoo | Annunci gratuiti per il mondo degli Animali
    ElettroMercatino | Annunci a tema Informatico ed Elettronico

  8. #8
    Ah ho capito! Grazie

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333

    Moderazione

    php_4ever
    Il linguaggio va indicato sempre nel titolo, come da Regolamento.

    Qui l'ho aggiunto io, assieme a una descrizione più significativa del problema.
    In futuro, provvedi tu.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Il linguaggio è il C, non il C++, e il problema non è affatto l'uso di strncpy, era un errore logico (non potevo sapere infatti che era strncpy).

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.