0

我有以下两个功能。函数get_string_data(line)malloc 一个字符串并返回它。后来我像这样使用它:

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,已中止。)。为什么会发生这种情况,释放内存的正确方法是什么?

4

2 回答 2

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';
于 2013-07-30T21:50:23.980 回答
1

free(line)get_string_data 可能将指针移动到“行”中的某个位置,这不是返回到 free() 的正确指针。

于 2013-07-30T21:42:59.173 回答