在使用的自由变量返回函数后的分段错误

时间:2016-08-25 14:26:44

标签: c segmentation-fault free mtrace

我需要ipv6地址中的最后2列。 (2001:1234:asdd:xeed:212:4b00:61) - > (4b0061)我还需要知道如何释放ipv6_parser函数的返回。

当我试图释放结果时,它会被给予“分段错误”。

char* ipv6_parser(char* str){
    char *ret = malloc(sizeof(str));

  ret = str;
  ret = strtok(ret,":");
  int i ;
  for (i=0;i<5;i++){
        ret = strtok(NULL, ":");
  }
  char *last = strtok(NULL, ":");
  sprintf(ret,"%s%s",ret,last);

  return ret;
}

int main(){
  mtrace();

    char *str=strdup("2001:1234:asdd:xeed:212:4b00:61");
    char* result    = ipv6_parser(str); 
    printf("\nResult - %s\n",result);
  free(result);
  free(str);
return(0);
}

1 个答案:

答案 0 :(得分:1)

  • ret = str;不是复制字符串,而是将输入指针本身分配给ret并导致内存泄漏。
  • 您无法使用sizeof(str)来确定字符串的长度。
  • sprintf(ret,"%s%s",ret,last);通过在已包装的对象之间进行复制来调用未定义的行为

试试这个:

char* ipv6_parser(const char* str){
  char *ret = malloc(strlen(str) + 1);
  if (ret == NULL){
    perror("malloc ret");
    return NULL;
  }
  char *ret_buffer = ret; /* store where the buffer is to free it after using */

  strcpy(ret,str);
  ret = strtok(ret,":");
  int i;
  for (i=0;i<5;i++){
    ret = strtok(NULL, ":");
  }
  char *last = strtok(NULL, ":");
  char *final_ret = malloc(strlen(ret) + strlen(last) + 1);
  if (final_ret == NULL){
    perror("malloc final_ret");
    free(ret_buffer);
    return NULL;
  }
  sprintf(final_ret,"%s%s",ret,last);
  free(ret_buffer);

  return final_ret;
}