Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    10

    [C] Piccolo problema su strcpy

    Salve a tutti, ho un problema da cui non riesco a venire a capo, forse è qualcosa di stupido che mi sfugge:

    Ho un segmentation fault da questo codice

    codice:
    char *opt[10];
    strcpy(opt[0],"ls");
    strcpy(opt[1],"-l");
    strcpy(opt[2],"-a");
    strcpy(opt[3],(char *)0);
    
    execvp(opt[0],opt);
    In realtà ho questo problema su un programma più ampio e gli strcpy li faccio in un ciclo for da argv del main in un array di stringhe che devo passare poi alla exec, gdb mi dava un SEGV sulla strcpy.
    Qui ho semplificato leggermente ma il principio e l'errore è identico.

    Grazie in anticipo.

  2. #2
    char* opt[10] dovrebbe essere un vettore di dieci puntatori a stringa (o, in generale e più correttamente, a char)

    essendo puntatori, prima di poterci copiare dentro qualcosa, devi allocare lo spazio adatto

    opt[0], opt[1] etc non hanno spazio allocato, perciò puntano a zone sconosciute, perciò non hai garanzia di poterci scrivere o leggere in quelle zone di memoria
    a questo è dovuto il segv fault

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    10
    Ok quindi in linea di principio, mi basterebbe un:

    char opt[4][20];

    Ma l'errore me lo da comunque.

  4. #4
    a me un codice tipo

    codice:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
    	char vett[4][20];
    
    	strcpy(vett[0], "lol");
    	printf("%s", vett[0]);
    
    	return 0;	
    
    }
    non da alcun errore

  5. #5
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao ... Il problema é nell' ultima chiamata di strcpy
    codice:
    strcpy( opt[ 3 ] , (char* )0 );
    Probabilmente questa funzione si aspetta come secondo parametro un indirizzo di una stringa allocata (quindi dereferenziabile tramite il puntatore) e quindi non effettua nessun controllo (ergo nell' ultima chiamata viene dereferenziato un puntatore nullo) ... Per risolvere basta sostituire la chiamata difettosa con
    codice:
    opt[3] = (char*)0;
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    21
    Originariamente inviato da Nrk
    Ok quindi in linea di principio, mi basterebbe un:

    char opt[4][20];

    Ma l'errore me lo da comunque.
    Oppure potresti allocare dinamicamente la memoria per i vari opt[0], opt[1], tipo..

    codice:
    opt[0] = new char[20];
    opt[0] = "...";
    Questo avviene perchè char * sarebbe in teoria un const char * no?

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    10
    @Celebron Neanche a me infatti, il problema è su quello con 0

    @Krow Già provato, non gli andava bene comunque

    @KolDeath Quello è c++, e comunque non è quello il problema perchè sarebbe come char array[x][y], cambia solo che li fai uno alla volta

  8. #8
    ah ecco, pensavo fosse un problema su tutte le strcpy

    comunque ti basta fare
    strcpy(vett[0], "\0"); e funziona (a dirla tutta non comprendo perché tu abbia provato con (char*)0 che non ha molto senso)

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    10
    Era una delle tante prove, la prima delle quali era proprio "\0", come l'ho sempre usato, non capisco proprio dove sia il problema..

  10. #10
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Cioé hai ancora problemi di segmentation fault??? Se si, sempre alla chiamata di strcpy ???
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

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.