删除分配的字符串数组

时间:2020-05-10 02:27:47

标签: c

我有一个函数,该函数返回可以循环使用的动态分配数组的列表。呼叫者正在释放列表,但仍从valgrind收到泄漏警告。

我正在使用此版本,因此调用方不需要知道数组的长度,并且可以简单地循环直到NULL。

char **getList() {
    char **list = (char *[]){"John Doe", "Jane Doe", NULL};
    char **values = malloc(sizeof(char*) * 1);
    int i = 0;
    while(*list) {
        values[i] = malloc(sizeof(char) * (strlen(*list) + 1));
        strcpy(interests[i++], *list);
        list++;
    }
    values[i] = NULL;
    return values;
}

呼叫者级别

int main() {
    char **values = getList();
    while(*values) {
        // do something with the *value
        values++;
    }
    free(values); // free up the values

    return 0;
}

1 个答案:

答案 0 :(得分:0)

  • values递增,因此之后的free(values);无效。
  • values元素指向的字符串不会被释放。

尝试一下:

int main() {
    char **value_list = getList(), **values;
    values = value_list;
    while(*values) {
        // do something with the *value
        values++;
    }
    // free up the values
    for (values = value_list; *values; values++) {
        free(*values);
    }
    free(value_list);

    return 0;
}

还请注意

    char **values = malloc(sizeof(char*) * 1);
函数getList()中的

应该是

    char **values = malloc(sizeof(char*) * 3);

以避免越界写入。

相关问题