2016-08-25 5 views
-1

Мне нужен второй столбец в ipv6. (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); 
} 
+5

'SizeOf (НТР) и' STRLEN (НТР) 'очень разные –

+2

Это бессмысленно выделять память для' ret', если вы только собираетесь перезаписать указатель на эту память в самом следующем утверждении. Возможно, вы искали 'strdup()'? –

+0

Используйте отладчик памяти, такой как [Valgrind] (http://valgrind.org/), чтобы помочь вам найти проблемы. –

ответ

1
  • ret = str; не копирует строку, но назначение входной указатель непосредственно к ret и вызывает утечку памяти.
  • Вы не можете использовать sizeof(str), чтобы определить длину строки.
  • sprintf(ret,"%s%s",ret,last); invokes undefined поведение путем копирования между обернутыми объектами.

Попробуйте это:

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; 
} 
+0

Учитывая, что OP уже использует 'strdup()', вы можете вырезать 'malloc (strlen + 1); strcpy() 'raindance. – EOF

+0

Благодарим за помощь. он работает с этими кодами. Я понимаю, что мне нужно делать, когда я сталкивался с этими случаями. – Gkan