c - 在结构体中释放 char**

标签 c pointers struct free

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' 函数可以正常工作。

所以这是我的错误: '免费((*列表)->存储[a])'

最佳答案

这个分配是错误的:

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

由于storage是一个char**,因此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

关于c - 在结构体中释放 char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56156369/

相关文章:

c - 具有不同定义的类型转换结构

linux下的c图形

c - 在 Windows 和 Linux 下如何链接到 OS C 库?

c++ - 如何访问一个 32 位寄存器数组和读/写 16 位高段和低段作为一个单独的操作

c - 在 C 中搜索 BST 元素函数

dictionary - Elixir 将结构转换为映射

c - 这种数组插入的实现是否不正确?

键入时更改 linux 终端中关键字的颜色

c++ - 封装和指向对象的指针

c - 初始化结构体内部的数组