1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Duvida] segmentation fault C

Discussão em 'Programação' iniciada por arconada, 28 de Dezembro de 2007. (Respostas: 17; Visualizações: 1791)

  1. arconada

    arconada Power Member

    Boas!
    Estou com um pequeno (grande) problema.
    O codigo não dá erros ao compilar, constroi tudo na perfeição mas quando vou a correr dá me um erro quando chega a esta parte:

    Código:
            teste=string;
            
            printf("teste\n");
            
            while(*teste!='\0')
                {
                    if(*teste==' ')
                    {
                        argv++;
                    }
                      *argv=teste;
                      teste++; 
                }
    
    com as seguintes declarações:

    char **argv;
    char *teste;
    char string[30];


    Quando comento o *argv=teste; teste++; deixa de haver problemas, será que não posso fazer isto sem fazer casts? mas os apontadores nao sao basicamente um numero inteiro?!

    [​IMG]
     
    Última edição: 29 de Dezembro de 2007
  2. napalm

    napalm Power Member

    uma pergunta parva: estás a alocar espaço para o vector de strings? (o argv)
     
  3. souto

    souto To fold or to FOLD?

    argv++ ? Penso que não podes fazer isso. Isso são variáveis que são passadas ao programa, pelo que julgo que estar a alterar os apontadores aí é uma grande sapatada. Assustador mesmo.

    Porque é que queres fazer isso?

    Além disso, onde terminas string com '\0' ?
     
  4. SoundSurfer

    SoundSurfer Power Member

    Já agora, isso não é C#, é C.
     
  5. Baderous

    Baderous Banido

    É só a mim que não dá segmentation fault?
     
  6. arconada

    arconada Power Member


    Código:
    #include <unistd.h>
    #include <sys/wait.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <string.h>
    
    
    
    
    
    
    
    int main(){
        printf("------Bem Vindo Ao F.I.C-----\n\n");
        char string[30];
        int /*i*/ len, n_esp, T;
        n_esp=T=0;
        char **arg;
        char *teste;
    
        
        while(1){
            n_esp=0;
            printf(">>");
            gets(string);
            printf("acabou de escrever %s\n", string);//testar se a string introduzida é guardada
            len=strlen(string);
            printf("tamanho é :%d\n", len);
            
            teste=string;
            
            printf("teste\n");
            
            while(*teste!='\0')
                {
                    if(*teste==' ')
                    {
                        arg++;
                    }
                     *arg=teste;
                      teste++; 
                    
                }
                    
                    
                    
        
            printf("encontrei %d espaços\n", n_esp); //teste apenas. n_esp+1 = argc
            T++;
            printf("%s\n", *arg); 
            
        }
    }
    
    aqui fica o código que tenho até agora, já com o argv alterado para arg pelo sim pelo não... o erro persiste.
     
  7. TuxBoss

    TuxBoss Power Member

    Tens de inicializar tanto o arg como o teste com malloc's (o arg como é ** deverias usar o calloc).
    Depois se a memória não me falha não podes usar aquele gets com o string. Ou metes num novo apontador e fazes um strncpy para a string, ou simplesmente metes a string como char* a apontar para uma área com 30 bytes.
     
  8. arconada

    arconada Power Member

    poder usar o gets posso. embora nao haja controlo sobre o buffer. eu isso vou alterar para o fgets. mas será que tenho de alocar a memoria? são apenas apontadores... eu nao quero copiar dados. apenas criar apontadores para os mesmos dados..
     
  9. Baderous

    Baderous Banido

    Qual o objectivo deste programa?
     
  10. souto

    souto To fold or to FOLD?

    Contar o número de argumentos? Será isso?
     
  11. arconada

    arconada Power Member

    Para já recebe uma string separa argumentos. basicamente será uma shell/interpretador de comandos para linux. como ainda está numa fase inicial ainda só preciso de separar comando e argumentos.
     
  12. souto

    souto To fold or to FOLD?

    Não sei se é possivel usares, mas talvez te safes melhor com expressões regulares.
     
  13. r3pek

    r3pek Power Member

    2 erros k detectei no teu codigo foram:
    1º - Não podes alterar o conteúdo o argv pk esta variavel é a k te dá os parametros que foram passados para o programa, logo tem um tamanho fixo k não podes alterar. Assim, se alterares, SEGFAULT! :D
    2º - uma instrução do tipo "string1 = string2", em que string1 e string2 são variaveis não é possivel em C visto que a unica coisa k estás a dizer é que a string1 É a string2 (tas a igualar pointers e não os valores). Logo, se keres copiar o conteúdo duma variavel para outra usa o strcpy ou o strncpy (atenção k precisas de espaço alocado em memoria para a variavel the destino, seja por malloc ou definição da variavel como array).


    Com isto axo k já te ajudei.
     
  14. arconada

    arconada Power Member

    mas o que eu quero é igualar os pointers, e segundo o argv que eu uso nao é o passado ao programa, reparar que nao faço main (char * argv, int argc) (ou la como é) eu estou a definir o argv por mim, ja alterei o nome para arg so pelo facto de poder haver problemas... mas na realidade continua a dar o mesmo erro. e eu quero alterar os valores que estao nesse array. porque senao nao consigo separar os argumentos para fazer o execvp... :s o problema subsiste e ja estou a ficar lixado com f.
     
  15. r3pek

    r3pek Power Member

    o problema é k tens k alocar espaço para um **char pk sendo um pointer para um pointer, tens k alocar espaço no promeiro para o 2º la caber, por isso é k te está a dar o segfault.
    De qualquer das maneiras isso ainda nao tá bem pk a lógica k aí tens não funciona. Mas pronto, tá aki a minha solução para o teu problema do SEGFAULT, não do problema de lógica, a partir daki tira as conclusões para o resto:

    Código:
    char *teste = "ola teste";
            char *argv[10];
            int i = 0;
    
            while (*teste != '\0') {
                    if (*teste == ' ')
                            i++;
                    argv[i] = teste;;
                    teste++;
            }
    
     
  16. arconada

    arconada Power Member

    Desde já agradeço. vou testar mais tarde que agora estou no xp.
     
  17. Tyran

    Tyran Power Member

    Também podes testar no xp, tens o mingw (gnu para windows), ou mesmo devc++ (que usa o mingw), etc...

    cumpzz
     
  18. Ace-_Ventura

    Ace-_Ventura Power Member

    porque não usas o strtok então?
    exemplo:
    Código:
    #include <stdio.h>
    #include <string.h>
    
    
    int main ()
    {
       char str[] ="- This, a sample string.";
       char *token = NULL;
    
       printf ("Splitting string \"%s\" into tokens:\n",str);
       
       token = strtok (str," \t\n");
       while (token != NULL) {
          printf (">%s\n",token);
          token = strtok (NULL, " \t\n");
       }
    
       return 0;
    }
     

Partilhar esta Página