在结构内部释放g char **

时间:2019-05-15 19:26:17

标签: c pointers struct free

This问题类似于我的问题。
但是没有为我提供解决方案。

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

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

创建列表并添加项目很好。
但是删除列表会带来问题。

代码如下:

列表的声明:

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])'

1 个答案:

答案 0 :(得分:1)

此分配是错误的:

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