Linguagem C [ chamando a funcao free() ]

5 respostas
MaiqueL

Ola pessoal,

Gostaria de saber se esta certo o que eu estou fazendo.

char *str; 
for(i = 0;i < size ;i++){
   str=calloc(sizeof(char),100);//chamada a calloc n-vezes
   printf("Digite o endereco da URL:");
   scanf("%s",str);
   string[i]=str;
}
free(str);//chamada ao free uma vez

[]`s

5 Respostas

ViniGodoy

Esse programa está esquisito.

Se a idéia é ao final desse loop ter uma série de textos no array chamado string, então, o free no final está errado, pois ele irá apagar a última string do array e gerar um dangling pointer.

Se a idéia é ao final não ter nada na memória, então, o free deveria estar dentro do loop, substituindo a linha 06. Caso contrário, o for geraria uma série de dangling pointers.

MaiqueL

a idéia eh fazer o seguinte:

char *str; 
  for(i = 0;i < size ;i++){
    str=calloc(sizeof(char),100);
    printf("Digite o endereco da URL:");
    scanf("%s",str);
    string[i]=str;
  }
  //usa o vetor string para chamar outras funcoes
  ....
  //depois de usar o vetor string
  //chama o free para limpar
  free(str);
ViniGodoy

Ao final, você deve fazer free em todas as Strings dentro do vetor e no próprio vetor, caso ele também tenha sido criado por calloc/malloc:

for(i = 0;i &lt; size ;i++){ free(string[i]); } free(string);

A regra é clara. Criou com malloc/calloc, tem que liberar com free. No seu for, vc cria size vezes, terá que dar size frees.

MaiqueL

Soh que no meu caso eu tenho o seguinte:

int main () {
  
  int size;
  int i;
  printf("Digite a quantidade de URL para download:");
  scanf("%d",&size);
  char *string[size];
  
  char *str; 
  for(i = 0;i < size ;i++){
    str=calloc(sizeof(char),100);
    printf("Digite o endereco da URL:");
    scanf("%s",str);
    string[i]=str;
  }
  //usa a String para chamar outros programas
  //mais funcoes 
  ....
  //agora chama o free para limpar
  free(str);

eu vou ter que remontar a estrutura do meu programa?

MaiqueL

ViniGodoy:
Ao final, você deve fazer free em todas as Strings dentro do vetor e no próprio vetor, caso ele também tenha sido criado por calloc/malloc:

for(i = 0;i &lt; size ;i++){ free(string[i]); } free(string);

A regra é clara. Criou com malloc/calloc, tem que liberar com free. No seu for, vc cria size vezes, terá que dar size frees.


Ah sim no meu caso eh soh da size free no vetor string[i]

vlw :slight_smile:

Criado 16 de abril de 2012
Ultima resposta 16 de abr. de 2012
Respostas 5
Participantes 2