Quand dois-je utiliser free() en C?

Le code fonctionne comme il est censé le faire, si elle ne libère la mémoire allouée par malloc().

J'ai essayé de libérer de la mémoire, en quelque lieu que je peux, mais peu importe où je le fais, il se casse le programme. Plus précisément, je reçois un "double gratuit ou erreur de corruption." C'est plus une question de savoir ce que free() et malloc() faire réellement? Tous les problèmes avec free sont dans la main:

int main(int argc,  char *argv[]){
if(argc!=2){
exit(1);
}
printf("CSA WC version 1.0\n\n");
int length = strlen(argv[argc-1]);
char file_to_open[length];
strcpy(file_to_open, argv[argc-1]);
//printf("filename:%s\n",file_to_open);
//create counters for output
int count_number_of_lines = 0;
int count_number_of_words = 0;
int count_number_of_characters = 0;
//create int size of default array size
int current_array_size = pre_read(file_to_open);
//printf("number of lines: %i\n",current_array_size);
//create string array of default size
char *strings_array[current_array_size];
//create a pointer to catch incoming strings
char *incoming_string=NULL;
int done=0;
while(done==0){
incoming_string=get_line_from_file(file_to_open, count_number_of_lines);
if(incoming_string!=NULL){
incoming_string=csestrcpy2(incoming_string);
//printf("incoming line: %s\n",incoming_string);
strings_array[count_number_of_lines]=(char*)malloc(strlen(incoming_string+1));
strings_array[count_number_of_lines]=csestrcpy2(incoming_string);
//printf("added to array:%s\n",strings_array[count_number_of_lines]);
count_number_of_lines++;
count_number_of_characters=(count_number_of_characters+(strlen(incoming_string)-1));
}
else{
done=1;
}
}
//all data is stored in a properly sized array
//count all words in array
int count=0;
int word_count=0;
char *readline;
while(count<current_array_size){
readline = csestrcpy2(strings_array[count]);
printf("line being checked: %s", readline);
int i=0;
int j=1;
while( j< strlen(readline)+1 ){
if(strcmp(readline,"\n")!=0){
if( (readline[i] == ' ') && (readline[j] != ' ') ){
word_count++;
}
if( (readline[i] != ' ') && (readline[j] == '\n') ){
word_count++;
}
}
i++;
j++;
}
count++;
}
printf("current word count: %i", word_count);
return 0;
}
char* csestrcpy2(char* src){
int i = 0;
char *dest;
char t;
dest = (char*) malloc(MAX_LINE);
while( src[i] != '\0'){
dest[i] = src[i];
i++;
}
dest[i] = '\0';
//printf("length:%i\n",i);
free(dest);
return dest;
}
  • Il n'y a pas de raison de copie file_to_open de argv, vous pouvez simplement utiliser argv.
  • Curieux de savoir incoming_string=csestrcpy2(incoming_string); Est-ce juste une chaîne de caractères la fonction de copie?
  • Aussi, malloc(strlen(str+1)); est presque certainement faux. Vous signifiait probablement malloc(strlen(str)+1);. (Et beaucoup de gens, moi y compris, de recommander l'omission de la fonte de void * pointeurs être implicitement converti, et il peut causer des problèmes potentiels si vous convertir explicitement le mauvais type.)
  • csestrcopy2(incoming_string); une copie de chaîne de méthode qui renvoie une chaîne qui est la garantie d'avoir un '/0' à la fin de la ligne....
  • Merci de poster le code complet de votre csestrcopy2 fonction, car, à en juger par ce que vous avez posté dans les commentaires, c'est une partie de votre problème.
  • Récemment, j'ai modifié le code afin de refléter un changement que j'ai fait sur elle! le nombre de fois malloc() est dans le code a été réduit à un seul... je tiens à remercier tous ceux qui m'aident!
  • J'ai aussi ajouté le csestrcpy code ainsi
  • *note csestrcpy est une fonction à partir d'un autre fichier....