在结构中释放 char**

Deallocationg char** inside a struct

This问题和我的差不多
但是没有为我提供解决方案。

这只是用于测试和更好理解的简化代码。
我知道这段代码不关心 malloc 函数之后的问题。

该代码用于将单词保存在名为 List 的结构中,在用作数组的 char** 存储中。

创建列表并添加项目效果很好。
但是删除列表会出现问题。

代码如下:

列表声明:

typedef struct {
    char** storage;
} List;

主要:

int main(){
    int size = 2;
    List* list;
    list = new_list(2);
    add(list, "Hello", 0);
    add(list, "World", 1);
    printf("\nlist->storage[0]: %s", list->storage[0]);
    printf("\nlist->storage[1]: %s",  list->storage[1]);

    delete_list(&list,size);

    return 0;
}

创建一个新列表:

List* new_list(size) {
    List* listptr = malloc(sizeof(List));
    listptr->storage = (char**)malloc(size * sizeof(char));
    return listptr;
}

向列表中添加一个字符串:

void add(List* list, char* string, int pos) {
    list->storage[pos] = (char*)malloc(strlen(string) * sizeof(char));
    list->storage[pos] = string;
}

删除列表,所有成员:

void delete_list(List** list, int size) {
    int a = 0;
    for (a = 0; a < size; a++)
        free((*list)->storage[a]);

    free((*list)->storage);
    free(*list);
}

我在 for 循环中遇到错误,在第 'free((*list)->storage[a])'.
行 目标是删除每个分配的字符串。
如果列表没有成员,则代码 运行 不在 for 循环中并且 'delte_list' 函数运行良好。

所以这是我的错误: 'free((*list)->storage[a])'

这个分配是错误的:

listptr->storage = (char**)malloc(size * sizeof(char));
                                                ^^^^^

因为 storagechar**,所以 sizeof 应该是 sizeof(char*)。当你只使用 sizeof(char) 时,你的内存太少,后来你在分配的内存之外写入。

还有这一行:

list->storage[pos] = string;

好像不对。

这里你可能需要一个strcpy像:

strcpy(list->storage[pos], string)

并且还为字符串终止的 malloc 添加 1,即

malloc((1 + strlen(string)) * sizeof(char));

但是注意 sizeof(char) 总是 1 所以

malloc(1 + strlen(string));

很好。

顺便说一句:让你的 malloc 正确的一个好方法是使用 "sizeof what_the_variable_points_to"。喜欢:

char** x = malloc(size * sizeof *x);
                                ^^
                        Use *x instead of sizeof(char*)

通过这种方式,您始终可以获得正确的尺寸并避免由于简单的拼写错误而导致的错误。

以您的代码为例:

List* listptr = malloc(sizeof(List));     // works but
List* listptr = malloc(sizeof *listptr);  // this is less error prone