Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Segmentation fault - sei aonde é mas não sei como resolver


pierao

Pergunta

boa tarde pessoal

Boa tarde pessoal.

To fazendo um programa que eu tenho que copiar as strings do ARGV[] para um vetor de ponteiros.

int main(int argc, char** argv)
{
int j, i, x, m, n,status, cont;
int k;
char* comandi[10];
k=0;
n=argc;
k=atoi(argv[1]);

for(cont=0;cont<k;cont++)
{
comandi[i]=strdup(argv[i+1]);
}
//x=paralelo(k);
printf("os comandos são: %s\n %s\n %s\n ", comandi[0], comandi[1], comandi[2]);
}

O problema é que se eu deixar a linha "k=atoi(argv[1]);" ele me da segmentation fault na hora de chamar o programa pelo nome, por exemplo

./programa 5 file1 file2 file3

ele teria em argv[1] a string "5"

com o atoi eu transformaria ela pra um inteiro e armazenaria o valor em "k", correto ?

Mesmo assim, tirando a linha k=... o programa roda e me retorna uns caracteres ilegeiveis no printf final.

alguém pode me dizer q q eu to fazendo de errado ?

já tentei até usar o strdup pra alocar a memoria mas mesmo assim acho q eu to fazendo algo errado.

ajuda ???

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Olá!

O seu problema está no for. Quando você tira a linha do atoi, k passa a valer zero e assim não entra no for e não gera o erro.

Os caracteres estranhos quando não tem o atoi é porque a variável comandi não recebeu valor algum e portanto tem apenas lixo...

O erro em si é porque no for você usa a variável cont mas no comandi você usa i. A variável i não tem valor algum, o que não significa zero.

Em C, uma variável que não recebeu valor algum (não inicializada) possui qualquer valor. Assim você está acessando um valor além das dez posições reservadas ou até mesmo uma posição anterior no caso de i ter um valor negativo.

Para resolver o seu problema basta substituir i por cont no índice de comandi e no argv dentro do strdup.

Mais uma coisa: argc contém o número de parâmetros passados na linha de comando. Assim não precisa do parâmetro numérico na linha de comando, basta usar argc para saber o número de argumentos recebidos.

Qualquer dúvida avise!

Abraços,

Marcelo

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...