Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813

    [c] strcat e segmentation fault

    ciao a tutti...
    ho due stringhe che voglio concatenare, però siccome la stringa 1 è un argv e non la voglio modificare, quindi cosa ho pensato di fare:

    codice:
    char * dirpath = (char * ) calloc(strlen(argv[2])+5,sizeof(char));
    dirpath[0] = '\0';
    
    strcat(dirpath,argv[2]);
    strcat(dirpath,"./a");
    creo un area di memoria, dirpath, grande quando all'argomento passato da riga di comando + la lunghezza di caratteri ./a + 1 di terminatore (+1 per sicurezza).

    fare calloc su sizeof char so che è inutile, però pare che dia maggior chiarezza. Cmq inizializzo dirpath come una stringa vuota e concateno argv[2], e poi la stringa "./a"
    fatto ciò arriva il segmentation fault.
    Se faccio una sola concatenazione, funziona sia nel primo caso che nel secondo...
    Ho sostituito:
    strcat(dirpath,argv[2]);

    in

    strcpy(dirpath,argv[2]);
    ma nada!

    dove sto sbagliando?
    vi ringrazio anticipatamente
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se argv[2] non esiste (e' null) la strlen da' l'errore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    Originariamente inviato da oregon
    Se argv[2] non esiste (e' null) la strlen da' l'errore ...
    ti garantisco che nei test che ho fatto argv[2] c'era...

    infatti ho detto che se eseguo una delle due concatenazioni (commentando l'altra), nessun errore...accoppiate mi da questo segmentation fault
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Hysoka
    ti garantisco che nei test che ho fatto argv[2] c'era...
    Allora il codice deve funzionare ...

    infatti ho detto che se eseguo una delle due concatenazioni (commentando l'altra), nessun errore...accoppiate mi da questo segmentation fault
    Allora, dato che sono 4 righe, esegui il programma passo-passo e determina, con sicurezza, la linea in cui hai l'errore e le condizioni delle variabili in quel momento ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    Originariamente inviato da oregon
    Allora il codice deve funzionare ...



    Allora, dato che sono 4 righe, esegui il programma passo-passo e determina, con sicurezza, la linea in cui hai l'errore e le condizioni delle variabili in quel momento ...
    hai ragione...ci sto provando
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    ehm.....
    è un po' strano da spiegare...
    ma di fatto la concatenazione non c'entra assolutamente nulla con il segmentation fault, solo che non capisco xke si verificava anche quando le facevo...

    vediamo se riesco a farvi capire dove stava l'errore

    ho questa funzione
    codice:
    LinkedList * createNode(void * data)
    {
        LinkedList * l = (LinkedList *) malloc(sizeof (LinkedList));
    
        if (l != NULL)
        {
            l->data = data;
        }
        
        return l;
    }
    che crea un nodo di una lista doppiamente linkata...
    next e prev io non li inizializzavo a null, e quindi hanno devi valori casuali...
    quando io distruggo la lista, il test di l->right != NULL aveva successo e voleva liberare un'area di memoria proibita...
    però questo si verificava (e non so perché) in coincidenza della doppia concatenazione

    mettendo

    l->next = l->prev = NULL;

    alla fine di quella funzione tutto si è risolto
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Hysoka
    ehm.....
    è un po' strano da spiegare...
    ma di fatto la concatenazione non c'entra assolutamente nulla con il segmentation fault,
    Ecco ... volevo dire ...


    LinkedList * l = (LinkedList *) malloc(sizeof (LinkedList));
    Usa la calloc al posto della malloc ...


    P.S. I requisiti minimi per Vista sono un normale processore da 800 MHz e 512 M di RAM ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    Originariamente inviato da oregon
    Ecco ... volevo dire ...




    Usa la calloc al posto della malloc ...


    P.S. I requisiti minimi per Vista sono un normale processore da 800 MHz e 512 M di RAM ...
    e perché? non sto facendo un vettore di linkedlist...

    p.p.s. la mia firma lo copia-incollata da un so quale sito...Mi è piaciuta e me la sono messa ...Comunque, tu ce lo vedi Vista in eeepc?
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Hysoka
    e perché? non sto facendo un vettore di linkedlist...
    Cosa c'entra questo? Cosa fa la calloc che non fa la malloc?

    p.p.s. la mia firma lo copia-incollata ...
    Hai copia-incollato una delle tante bufale su Vista ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    Originariamente inviato da oregon
    Cosa c'entra questo? Cosa fa la calloc che non fa la malloc?



    Hai copia-incollato una delle tante bufale su Vista ...
    niente di strano, ma non è brutto fare
    LinkedList * l = (LinkedList *) calloc(sizeof(LinkedList),1);?
    cioè...io ne sto facendo 1, no n


    come tutte le bufale, c'è un pizzico di verità
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.