Pergunta

Estou usando a função strlen da biblioteca de strings c. Passei um NULL string a ele e encontrei um resultado misterioso. Eu sei que não devo passar string NULL, mas preciso de uma explicação para isso. O código é parecido com este

main()
{
  int k;
  char *s=NULL;
  strlen(s);
  // k = strlen(s);
}

No meu compilador gcc, ele funciona bem com o comentário. mas se você remover o comentário da linha k=strlen(s);

ele produz falha de segmentação. Alguma explicação?

Foi útil?

Solução

Este é o código assembler sem atribuição à variável int

movq    $0, -16(%rbp)
movl    $0, %eax
leave
ret

o compilador não chama _strlen porque o valor não será usado

Outras dicas

A primeira chamada 'strlen' que não está atribuindo seu valor de retorno provavelmente está sendo otimizada pelo seu compilador.

Passar um ponteiro nulo para strlen resulta em indefinido behvaiour . Tudo pode acontecer. Incluindo seg-faults.E não incluindo falhas de seg.

Se quiser saber o motivo exato, você precisará examinar o código assembler que o seu compilador gera.Mas isso não dirá nada de útil.

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