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/