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])'
答案 0 :(得分:1)
此分配是错误的:
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