"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que `strlen` e `sizeof` produzem resultados diferentes para strings baseadas em ponteiro e strings baseadas em array em C?

Por que `strlen` e `sizeof` produzem resultados diferentes para strings baseadas em ponteiro e strings baseadas em array em C?

Publicado em 2024-11-16
Navegar:714

Why do `strlen` and `sizeof` produce different results for pointer-based and array-based strings in C?

Saídas distintas em cálculos de comprimento e tamanho de string para inicialização de string baseada em ponteiro e matriz

Compreendendo os resultados

Ao criar uma string baseada em ponteiro str1 e uma string baseada em array str2 com o mesmo valor, as funções strlen e sizeof produz resultados diferentes. Especificamente, para as declarações:

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";

strlen retorna 7 para str1 e str2, pois mede o comprimento da sequência de caracteres, excluindo o terminador nulo (\0) no final.

No entanto, sizeof produz valores diferentes:

  • sizeof(str1) retorna 4 porque avalia o tamanho da variável de ponteiro, que é normalmente 4 bytes (sistemas de 32 bits).
  • sizeof(str2) retorna 8 porque determina o tamanho da matriz, que inclui o terminador nulo, resultando em 8 bytes (7 caracteres 1 terminador nulo) .

A diferença subjacente: tipo de dados versus alocação de memória

sizeof mede o tamanho do tipo de dados, enquanto strlen mede o comprimento da sequência de caracteres. No caso de str1, é um ponteiro para um char, então sizeof retorna o tamanho do ponteiro. Para str2, é uma matriz de caracteres, então sizeof retorna o tamanho de toda a matriz, incluindo o terminador nulo.

Uma análise mais detalhada

Para demonstrar o distinção melhor, considere:

char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;

Agora, str1 e str2 apontam para o mesmo array. Seus valores strlen são 7, mas seus valores sizeof diferem:

  • sizeof(str1) é 4 (tamanho do ponteiro)
  • sizeof(str2) é 8 (tamanho da matriz com terminador nulo )

Isso exemplifica como a avaliação do tamanho depende da estrutura de dados subjacente.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3