Por que strlen () aparecem para retornar no depurador do VC ++? [fechadas]
-
05-09-2019 - |
Pergunta
Eu tenho uma string em C ++ do tipo const char*
passado como argumento para strlen, mas ele retorna vazio.
ele vai como
strlen(astruct.string);
Obrigado ..
EDIT: Fiz alguns testes,
strlen("test");
ainda dá vazio .. porquê?
EDIT: Aqui está a imagem http://img14.imageshack.us/img14/1808/strlen.png
Desculpe por ser claro anteriormente. Formatação não estava funcionando muito bem. De qualquer forma, a confusão foi resolvido por ambos Evan Teran e Vlad Romascanu. Também dê uma olhada resposta de Brian R. Bondy.
Graças. Sinta-se livre para fechar.
Solução
No que se refere à sua captura de tela:. O depurador está exibindo <void>
para strlen(...)
quando na verdade ele deve exibir um erro
Você não pode chamar métodos e exibir seus resultados no relógio depurador. O depurador exibirá apenas variáveis ??e dados existentes. Ele não pode invocar métodos arbitrários na demanda desde os métodos podem alterar o estado do programa que está sendo depurado de maneiras que não foram previstos nem pelo autor do código, nem pelo depurador.
O que você pode fazer é, no seu código, temporariamente adicionar:
size_t tmp_len = strlen(struc.string);
seguida, compilar e adicionar tmp_len para o relógio.
Outras dicas
Você está confuso com o depurador de baixa qualidade de visual studio 6.0. Não confie nisso. Ele provavelmente não poderia obter o valor de retorno devido a inlining ou algo similar.
Imprimir o valor para obter o valor real.
EDIT: Além disso, com seu exemplo, parece que você não pode estar armazenando o resultado de strlen de qualquer maneira. Isso também pode ser uma razão pela qual o depurador não está vendo o valor de retorno. É inteiramente possível que o compilador decidiu que ele não precisa para realmente executar o strlen se você não estiver usando o valor.
NOTA: neste momento não há nenhuma desculpa real para ainda usando VC ++ 6.0. É um compilador antiga e IDE que é um compilador embaraçosamente pobre c ++. As versões mais recentes do visual c ++ compilador é livre (sem a IDE), usá-los.
strlen não é do tipo de retorno void, é seu depurador que não está dando a mensagem certa.
Por seu debbuger está mostrando vazio?
A implementação de strlen que você está usando é provavelmente enrolado em um #define strlen someothername_strlen.
O depurador provavelmente não suporta #define corretamente ou alguns outros modificadores sobre a função.
Você vai ter que fazer algo como Ilen = strlen ( "test"), em seguida, verifique Ilen em seu relógio.
Normalmente, você pode chamar funções em seu relógio. Por exemplo tentar definir a seguinte função, em seguida, chamá-lo no seu relógio:
int testFunc(char*)
{
return 5;
}
Você provavelmente irá obter 5 em seu relógio como resultado.
retornos STRLEN um inteiro, então eu suponho que você quer dizer que retorna "0".
Além disso, a maneira que você especifique o tipo de dados, eu não posso bastante dizer se é um const char * ou const char **. Se ele é o último, então você precisa se certificar de que você está dereferencing o ** a um único *.
Meu palpite é que a seqüência começa com um byte nulo, razão pela qual ele está retornando 0.
Em C ++, funções sempre retornam um valor do tipo tenham sido declarados retorno. Desde a declaração da função strlen
é algo como isto:
size_t strlen(const char *);
A única coisa que pode possivelmente retorno é um size_t
. O compilador usa esta informação em tempo de compilação para determinar como lidar com o valor de retorno quando você chamar a função. O ponto aqui é que se a função strlen
é declarado como acima, não pode decidir voltar void
por vezes, e um valor do tipo size_t
outras vezes.
Esta é geralmente uma característica de linguagens de tipagem estática, como C ++. Em linguagens de tipagem dinâmica (Perl, Python, Ruby, PHP, etc) uma função pode decidir devolver um valor de qualquer tipo cada vez que ele é chamado.
Não pode retornar void. Vazio é a falta de um valor de retorno, então você não pode, err, devolvê-lo.
Como você verificar se há qualquer maneira vazio? Vazio não é um valor. Por favor, demonstrar como você está ficando vazio. É tempo de compilação ou tempo de execução?
Se você de fato tem um sistema onde strlen
é declarado com um tipo void
retorno, correr tão rápido quanto você pode em outra direção.