Search code examples
cmemoryvalgrind

C - Freeing string after cycle for


I have this simple function for extrapolate a substring in a string.

char* substr(const char *string, size_t start, size_t end) {

  const char *char_start = &string[start];
  const char *char_end = &string[end];

  char *substring = (char *) calloc(1, char_end - char_start + 1);
  memcpy(substring, char_start, char_end - char_start + 1);

  return substring;
} 

I have only one calloc, that create the returned string. I try the code in a cycle, for extrapolate the substring of a string array. This is the main code where I test the function:

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

int main(void) {
  size_t i;
  char *tmp = NULL;
  char *kmer_array[5] = {"GTGAA", "ACGGT", "AACGG", "AGTGA", "TGAAC"};

  for ( i = 0; i < 5; i++ ) {
    tmp = substr(kmer_array[i], 1, strlen(kmer_array[i]));
  }  

  free(tmp);      

  return 0;
} 

But when I test the code with valgrind this is the output (link).

I dont't understade where I lost the byte


Solution

  • You set tmp inside the loop 5 times but only free the last one (outside the loop)