Jump to content
polska

[Resolvido] Free() erro

Recommended Posts

polska

Boas pessoal, aqui num programita em que uso memória dinâmica, estou a ter um erro que não percebo o porquê de estar a ocorrer...

Trata-se do uso da função free() para libertar o ponteiro n ... O erro é: "Unhandled exception at 0x520A586E (msvcr110d.dll) in memoriaDinamica.exe: 0xC0000005: Access violation reading location 0x00000000."

Estive a ver e tenho quase a certeza, mas agora também gostava de ficar esclarecido, será que a função só liberta blocos de memória alocados? (por exemplo arrays..) .. Tenho esta dúvida porque penso que seria lógico também libertar ponteiros de variáveis "singulares", por exemplo um inteiro de 4 bytes, como é o caso deste programa..

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int i, *n = NULL, *valores = NULL;

   n = (int*) malloc(sizeof(int));

   if(n != NULL)
   {
       printf("Memoria alocada com sucesso!\nDigite o tamanho do array:\n");
       scanf("%d", &n);

       valores = (int*) malloc((int)n * sizeof(int));
       if(valores != NULL)
       {
           printf("Memoria alocada com sucesso!\nDigite os valores do array: \n");
           for(i=0; i<(int)n; i++)
               scanf("%d", &valores[i]);

           printf("Valores inseridos:\n");
           for(i=0; i<(int)n; i++)
               printf("%d ", valores[i]);
           printf("\n");

           free(valores);
       }
       else
       {
           printf("Erro ao alocar memoria!\n");
       }

       free(n); //ERRO
   }
   else
   {
       printf("Erro ao alocar memoria!\n");
   }

   return 0;
}

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites
HappyHippyHippo

um bloco de memória alocada não tem tipo. é um bloco, e o malloc/realloc/free trata-o como tal.

o teu problema é :

   n = (int*) malloc(sizeof(int));
   if(n != NULL) {
     printf("Memoria alocada com sucesso!\nDigite o tamanho do array:\n");
     scanf("%d", &n); // <-----------------------------------------

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
polska

um bloco de memória alocada não tem tipo. é um bloco, e o malloc/realloc/free trata-o como tal.

o teu problema é :

   n = (int*) malloc(sizeof(int));
   if(n != NULL) {
     printf("Memoria alocada com sucesso!\nDigite o tamanho do array:\n");
     scanf("%d", &n); // <-----------------------------------------

Desculpa mas não percebi o problema, faço o mesmo com o array...


Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites
HappyHippyHippo

que tipo de dados é a variável "n" ?

que tipo de dados a função scanf necessita ?

que tipo de dados estás a fornecer à função scanf ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
polska

que tipo de dados é a variável "n" ?

que tipo de dados a função scanf necessita ?

que tipo de dados estás a fornecer à função scanf ?

Não sabia que não era necessário o operador & para ler ponteiros... Fiz uma pesquisa rápida e descobri logo isso, mas já agora @Happy , porque é que no caso de ler para o ponteiro do array valores já preciso do & ? Eu encontrei uma resposta bastante boa no stackoverflow mas respondeu-me a tudo menos isto...

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites
polska

Okay, isto levou-me aqui a aprender umas coisas que desconhecia mesmo! Muito obrigado pela explicação @Happy, foi esclarecedor!


Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.