Ir ao conteúdo
  • Cadastre-se

C alocação dinamica, liberar memoria


UmPrograma

Posts recomendados

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
Link para o comentário
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 1
Link para o comentário
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
Link para o comentário
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

Link para o comentário
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!

 

  • Curtir 1
Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...