Ir ao conteúdo
  • Cadastre-se
Lívio Neiva

vetor string com 5 colunas (carateres)

Recommended Posts

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);}

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito Obrigado pela atenção!!!

 

por favor mande  código completo para eu saber como ficará a aplicação, para que eu possa entender melhor e fazer comparações.

da biblioteca ate a ultima linha de código,

 

Falou obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código é o mesmo.

Apenas troque a declaração da variável:

char msg[5];

Por:

char *msg = malloc(5);

 

E adicione a seguinte função como a última a ser executada na função "main()":

free(msg);

Compartilhar este post


Link para o post
Compartilhar em outros sites

char *msg = malloc(5);

free(msg);

 

qual a função do código acima??

 

qual a função do malloc??

e qual a função free ??

Compartilhar este post


Link para o post
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/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×