我有以下两个功能。函数get_string_data(line)
mallocs一个字符串并返回它。后来我这样用它:
char *get_string_data(char *) {
char *sec_tok, *result;
Split *split;
split = split_string(line, ' ');
sec_tok = split -> tail;
if (starts_with_char(sec_tok, '\"') && ends_with_char(sec_tok, '\"')) {
result = (char *) malloc(strlen(sec_tok) + 1);
strcpy(result, sec_tok);
free(split);
result++;
*(result + (strlen(result) - 1)) = '\0';
return result;
}
free(split);
return NULL;
}
void handle_string_instr(char *line) {
char* data = get_string_data(line);
...a few lines later, after I used the data...
free(data);
... end of the world happens here...
}
现在尝试释放字符串时,所有内容都会崩溃(程序接收信号SIGABRT,Aborted。)。为什么会发生这种情况,以及释放内存的正确方法是什么?
答案 0 :(得分:5)
以下是问题代码
result = (char *) malloc(strlen(sec_tok) + 1);
...
result++;
...
return result;
此时get_string_data
方法不再返回指向已分配内存的指针。而是将指针返回到已分配的内存中。您只能将指针传递给分配给free
的内存。在这种情况下,你没有,这就是它崩溃的原因
还有一种更简单的null终止字符串的方法是
size_t length = strlen(sec_tok);
result = (char*)malloc(length + 1);
...
result[length] = '\0';
答案 1 :(得分:1)
free(line)
get_string_data可能会将指针移动到“line”中的某个位置,这不是返回free()的正确指针。