Pergunta

Eu encontrei duas formas de passar argumentos de linha de comando em um array de caracteres:

int main (int argc, char **argv)
{
  const char *s1 = argv[0];
  char s2[256];
  strcpy(s2, argv[0]);

  printf("s1: %s\ns2: %s\n\n", s1, s2);
}

Compilado com o compilador da IBM xlc em um Returns sistema AIX

[MyPrompt]> ./a.out

S1: ./a.out

s2: ./a.out

Qual implementação (S1 ou S2) está correta? S1 é bom porque argv [0] pode ser de qualquer comprimento. s2 exige que o comprimento de argv [0] <256 caracteres.

Eu não entendo como / por s1 deve funcionar. I acha do lado direito de s1 deve ser exigido no momento da compilação, mas eu pensar é gerado em tempo de execução.

Foi útil?

Solução

obras A razão s1 é porque o tipo de argv [0] é um ponteiro. Você está simplesmente atribuir o endereço (não o valor real), que é segura. Você não está realizando qualquer tipo de atribuição ou elenco.

Eu normalmente prefiro a primeira opção como você só deve estar lendo a partir das variáveis ??de argumento.

Outras dicas

Se você não quiser alterar a seqüência, em seguida, trabalho vontade s1.

Se você quiser alterar a seqüência, em seguida, você pode fazer uma cópia do mesmo. Você deve usar o mais seguro strnlen () e strncpy () mas se o sistema suporte.

Eu acho que o lado direito de s1 deve ser exigido em tempo de compilação, mas eu acho que é gerado pelo tempo de execução.

Não, é exigido cada vez que a instrução é encontrado. Por exemplo:

void f() {
   int x = 1;
   ...
}

O inteiro x será inicializado a 1 cada vez que a função é chamada, não em tempo de compilação.

s2 tem a propriedade de ser agradável susceptível a uma sobrecarga da memória intermédia.

pessoas

eu vi alterar o valor de argv [0]. Em alguns casos, (em alguns sistemas operacionais) mudando argv [0] fará com que o programa de aparecer em ps como o que você mudou para.

Se você quiser apenas fazer referência ao argumento sem fazer quaisquer alterações, em seguida, s1 está correto.
Se você precisar modificar o argumento de qualquer maneira, então você precisa fazer uma cópia do mesmo como no s2 exemplo, mas na s2 exemplo, você precisa verificar explicitamente ver se o comprimento é maior do que o buffer que você está copiando-o para. Por exemplo, se estiver a tomar um argumento como filename.jpg como entrada e salvar a filename.gif como a saída, então você precisa fazer uma cópia desse argumento, pois você estará alterando a extensão de .jpg para .gif

Eu iria com S1, especialmente para argv [n], onde n> 0. Coisas como s2 abri-lo até para ataques clássicos de estouro de buffer. Basicamente, um usuário pode formatar um argumento que é mais de 256 caracteres de comprimento e informações de substituição na pilha para que eles possam executar qualquer código que eles querem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top