在函数中使用 return 的自由变量后出现分段错误
Segmentation fault after free variables which are used return in function
我需要 ipv6 地址中的最后 2 列。 (2001:1234:asdd:xeed:212:4b00:61) --> (4b0061) 我还需要知道如何释放 return 的 ipv6_parser 函数。
当我尝试释放结果时 "Segmentation fault" 给出了它。
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);
}
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;
}
我需要 ipv6 地址中的最后 2 列。 (2001:1234:asdd:xeed:212:4b00:61) --> (4b0061) 我还需要知道如何释放 return 的 ipv6_parser 函数。
当我尝试释放结果时 "Segmentation fault" 给出了它。
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);
}
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;
}