Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Josesousa

C alocação dinamica, liberar memoria

Recommended Posts

Boa noite, como estão?

 

O professor estava a explicar sobre alocação dinamica de memoria, no entanto quando ele propos um exercicio com o uso da funcao free que quando resolvermos ele não librerou a memoria como deveria ter sido feito segundo o professor.

No caso perguntamos porque nao deu certo e ele nao respondeu (ate onde vi todos falaram que nao deu certo). Era para aparecer 0 (zero) segundo o professor.

Segue o codigo,, se puderem olhar e apontar o erro.

 

#include <stdio.h>
#include <stdlib.h>   // NECESSARIA !!!!
main(){
    int a, *p, i;

    printf("Digite valor de a: ");
    scanf("%d", &a);

    p = (int *)malloc(a*sizeof(int));
    if(!p){
        printf("ERRO: MEMORIA INSUFICIENTE!");
        exit;
    }
    for(i=0;i<a;i++){
        p[i]=i*i;
    }
    for(i=0;i<a;i++){
        printf("Vetor p[%d]: %d\n", i, p[i]);
    }
    printf("\n\nAhora depois de deixar de apontar para o p.\n");
    free(p);
    for(i=0;i<a;i++){
        printf("Vetor p[%d]: %d\n", i, p[i]);  /// ERA AQUI QUE ERA PARA MOSTRAR ZERO, SEGUNDO O TEACHER.
    }

return 0;
}

OBS: Ele me disse que o free nao apaga, mas faz com que o ponteiro deixe de apontar para ele (a variavel que ele apontava). 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa Olá. A questão é q para responder a essa pergunta fica difícil, pois, quase inevitavelmente, seria preciso ir contra o q seu "teacher" falou para ser possível dar uma resposta adequada  :tw_grimace:

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá tudo bem?

 

Existem profissionais que seguramente dizem isso, dizem também que free devolve a memória para o sistema operacional e entre outras afirmações. Se isso é um quesito importante e se fosse permitido poderia ter zerado no algoritmo mesmo. Inclusive cada um dos valores alocados (eu faço isso mesmo sem motivos) e por fim o ponteiro.

 

Eu nunca experimentei um função free que anula ponteiros, e uma função free que não só desaloca memória como também libera para os sistema operacional. Essas coisas são mitos para mim.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC @giu_d Deixe-me ver então.

QUer dizer que depois de usar o free, a variavel não é anulada. Quando perguntamos porque não estava dando certo a ele, ele simplesmente não respondeu, e olha que ninguem na sala conseguiu.

Estavamos fazendo exercicios simples depois de cada pequena parte que ele explicava. Que no caso eram sobre alocação (malloc, calloc, realloc, free).

 

O free não deve ser usado depois que alocar algo dinamicamente, para liberar memoria (ou algo assim).???????

 

So sei que ele disse que não deveria mostrar nada, que daria erro. Mas, em algum momento,  ele disse sobre zerar.

Acredito que deveria mostrar lixo na memoria, que é o que o porgrama esta fazendo ( EU ACHO), mas não sei se esta certo (alias nem dos programas que fiz de alocação kkkkk , perguntei a professor como era para ser a resposta dos outros programas e ele disse : Se você fez tudo certo,então esta certo, chato isso pois não sei se estou indo pro caminho certo)

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa Creio q seria interessante procurar conversar com o seu professor e, se necessário, mostrar, d alguma forma, o q está acontecendo no código.

Por exemplo: Com respeito ao q ele disse:

14 horas atrás, Josesousa disse:

OBS: Ele me disse que o free nao apaga, mas faz com que o ponteiro deixe de apontar para ele (a variavel que ele apontava). 

Perceba o q ocorre no programa se imprimir os endereços apontados por p antes e depois do free:

#include <stdio.h>
#include <stdlib.h>   // para a função malloc e free

int main() {
    int a, *p, i;

    printf("Digite valor de a: ");
    scanf("%d", &a);

    p = malloc(a*sizeof(int));
    if(!p) {
        printf("ERRO: MEMORIA INSUFICIENTE!");
        exit(1);
    }
    for(i=0; i<a; i++) {
        p[i]=i*i;
    }
    printf("Valor apontado por p: %d. Endereco: %d\n\n", *p, p); // aqui p aponta para o endereço de memória do primeiro elemento, para imprimir o valor desse elemento: *p
    for(i=0; i<a; i++) {
        printf("Vetor p[%d]: %d. Endereco vetor p[%d]: %d\n", i, p[i], i, &p[i]);
    }
    printf("\n\nAhora depois de deixar de apontar para o p.\n");
    free(p);
    printf("Valor apontado por p: %d. Endereco: %d\n\n", *p, p);
    for(i=0; i<a; i++) {
        printf("Vetor p[%d]: %d. Endereco vetor p[%d]: %d\n", i, p[i], i, &p[i]);  
    }

    return 0;
}

Vê se deu p entender

Editado por giu_d
corrigir comentário
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Valeu.

Deu para entender sim.

 

So uma coisa o formatador de saída não é o ->  %p , para o endereco de memoria ?

 

Obs: no incio achei que o meu estava errado, pois so anulava o dois primeiro numero, e o resto se repetia igual.

Editado por Josesousa
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
50 minutos atrás, Josesousa disse:

O free não deve ser usado depois que alocar algo dinamicamente, para liberar memoria (ou algo assim).???????

Free deve ser utilizado Sim, se um bloco de memória é alocado esse bloco de memória será disponibilizado (desalocado) após o uso de free no processo atual, e se o mesmo processo / programa acabar, para o sistema operacional. Até onde sei.

 

 

Ok!

 

Editado por AnsiC
Correção: não sei usar vírgulas > <
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
39 minutos atrás, Josesousa disse:

So uma coisa o formatador de saída não é o ->  %p , para o endereco de memoria ?

Exato. Seria %p mesmo para imprimir o endereço de memória. Falha minha aqui

Editado por giu_d
  • Curtir 1
  • Obrigado 1

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






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

×