Serial.print show garbage when used several times

Ok I added a malloc in the function and freeing the pointers after using them:

char * intToBin(unsigned int k, int maxlen = 0){
  int i = 0, j;
  if(maxlen == 0){
    maxlen = sizeof(k) * 8;
  }
  unsigned int exponent;
  j = maxlen - 1;
  char *bin = malloc(maxlen + 1);
  while(i <= j){
    exponent = 1 << (j - i);
    if(k >= exponent){
      k -= exponent;
      sprintf(bin + i, "%s", "1");
    }
    else {
      sprintf(bin + i, "%s", "0");
    }
    i++;
  }
  return bin;
}

...

void transmit(){
  char message[64];
  char * serial = intToBin(deviceSerial);
  char * code = intToBin(nextCode());
  char * occurrence = intToBin(getOccurrence());
  Serial.println(serial);
  Serial.println(code);
  Serial.println(occurrence);
  Serial.println(buttons);

  free(serial);
  free(code);
  free(occurrence);

  //mySwitch.send(message);
}

I come from higher level code, I really try to avoid pointers and stuff.. I need it to work, I'll have time to learn after.