Ir ao conteúdo
  • Cadastre-se

vetor string com 5 colunas (carateres)


Lívio Neiva

Posts recomendados

criei uma função para contar quantos caracteres tem a palavra, para tal função criei um vetor com 5 caracteres.

criei dois printf para informa a saida de dados, o problema é, quando eu compilo e insiro uma palavra com 7 caracteres ou mais,

 primeiro printf que mostra a variavel quant, da o resultado corretamente mesmo que eu tenha inserido uma quantidade superior a 6,

o segundo printf que tem a mesma funcionalidade do primeiro printf, mas mostra o resultado correto se eu inserir uma palavra ate 6 caracteres, se eu inserir

uma palavra superior a 6 caracteres ele nao da o resultado correto, mostra apenas o valor 6.

Porque???

se vocês forem acrescentar mas codigos expliquem a função e o motivo, por favor sou estudante de C.

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>int msgrecebe(char close[]); //prototico main (){char msg [5];int quant;printf ("entre com mensagem: ");gets (msg);quant=msgrecebe(msg);printf("%d",quant); // mostra o resultado correto independente de quantos carateres eu inserir na variavel "msg"printf("\nQuantos caracteres tem messagem: %d \n",msgrecebe(msg)); so mostra resultado corretamente palavras com ate 6 caracteres, palavras com 7 ou // mas ele trava no 6.printf("\n\n");system("pause");}int msgrecebe(char close []){    int i;    i=strlen(close);}
Link para o comentário
Compartilhar em outros sites

Primeiramente, você já está ciente de que está forçando estouro de memória, logo, estará esperado que um resultado incorreto retorne.

A partir do momento que estoura o espaço alocado, o resultado vai depender do comportamento de como o sistema operacional trata a execução do programa. Isso pode mudar (e quase sempre muda) de um sistema operacional para outro.

 

No caso do seu código, como está utilizando alocação estática (vetor[]), cada vez que o vetor é passado por parâmetro, ele é copiado inteiramente (memória stack/pilha) para a área de execução do novo contexto.

Como ele está estourando memória, pode ocorrer de perder o carácter terminador de string ('\0'), fazendo com que a função "strlen()" necessite ir mais distante na busca, para encontrá-lo (lixo de memória).

Exemplo rodando no windows 7 64 com compilador GCC 4.8.1:

Código:

    char msg[5];    int quant;    int quant2;     printf ("entre com mensagem: ");    gets (msg);     quant = msgrecebe(msg);    printf("%d\n",quant);     quant2 = msgrecebe(msg);    printf("%d\n",quant2);     printf("Quantos caracteres tem messagem: %d \n",msgrecebe(msg));    printf("\n\n");
 
Saída:
entre com mensagem: qweqweqweqwe1210Quantos caracteres tem messagem: 6

 

Se utilizar alocação dinâmica, o conteúdo será compartilhado entre as chamadas, pois a informação na memória stack é apenas a referência para o conteúdo que está na memória heap (memória dinâmica).

Portanto, se o conteúdo é o mesmo, o resultado deveria ser o mesmo, correto?

Vejamos o código, apenas trocando o tipo da variável:

    char *msg = malloc(5);    [...]    free(msg);
 
Saída:
entre com mensagem: qweqweqweqwe1212Quantos caracteres tem messagem: 12
Link para o comentário
Compartilhar em outros sites

Malloc - Memory Allocation (Alocação de memória)

Free - Free (Liberar)

 

A função malloc aloca espaço em memória para o tamanho que definimos. O valor base dele é byte. No caso, quero 5 bytes (5 carácteres).

A função free libera o espaço que alocamos, para não ficar acumulando o programa com espaço em memória desnecessário.

 

A memória quando alocada dinamicamente, ela fica armazenada na memória heap. Como já comentei acima sobre stack e heap.

 

Para mais informações:

http://www.cplusplus.com/reference/cstdlib/malloc/

http://www.cplusplus.com/reference/cstdlib/free/

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...