• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

bertolo

limpeza de matrizes

7 mensagens neste tópico

boas pessoal qual o problema disto....fds nao entendo

void limpa_matriz_float(int x,int y,float **matriz)
{
  for(x=x-1;x>=0;x--)
    {
for (y=y-1;y>=0;y--)
    free((float)matriz[x][y]);

free(matriz[x]);
    }
return ;
}

diz-me

base_dados_aux.c: In function ‘limpa_matriz_char’:

base_dados_aux.c:128: warning: passing argument 1 of ‘free’ makes pointer from integer without a cast

base_dados_aux.c:134: warning: ISO C forbids nested functions

base_dados_aux.c: In function ‘limpa_matriz_float’:

base_dados_aux.c:139: error: incompatible type for argument 1 of ‘free’

base_dados_aux.c: In function ‘limpa_matriz_char’:

base_dados_aux.c:134: warning: ISO C90 forbids mixed declarations and code

base_dados_aux.c:144: error: expected declaration or statement at end of input

make: *** [roadtoll_server] Error 1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não podes libertar memoria de uma variavel - esses (float) matrix[ x ][ y ]. Para libertares a memória basta-te o free(matriz[ x ]);

void free(void *ptr);

free() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behaviour occurs. If ptr is NULL, no operation is performed.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E free(matriz) ?

Acho que não chega. Porque "matriz" é um array de apontadores de floats (apontador para o array de cada linha). Acho que só vai libertar a memoria desse array e não liberta a memoria de cada linha da matriz.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cada um dos mallocs tem que ter um free!

Para um array de array tens que fazer 1 malloc para o "array mestre" e outros malloc's para cada sub-array. Pois bem ... os free's são 1 por cada sub-array e outro pelo "array mestre".

#include <stdlib.h>
#define ROWS 42
#define COLS 24
int main(void) {
  double **array;
  int i;

  array = malloc(ROWS * sizeof *array);
  for (i=0; i<ROWS; i++) {
    array[i] = malloc(COLS * sizeof **array);
  }

  /* usa array */
  array[4][7] = 42.42;

  for (i=0; i<ROWS; i++) {
    free(array[i]);
  }
  free(array);
  return 0;
}

Edit: É claro que os mallocs deviam ser testados! :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não chega. Porque "matriz" é um array de apontadores de floats (apontador para o array de cada linha). Acho que só vai libertar a memoria desse array e não liberta a memoria de cada linha da matriz.

Eu não estava a sugerir que chegava, estava a perguntar se, para além do

free(matriz[x])

não era necessário

free(matriz)

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora