malloc():将元素添加到动态列表时损坏的顶部大小
malloc(): corrupted top size when adding an element to a dynamic list
我正在写一个动态列表。
这是包含动态列表的头文件和将元素添加到列表的函数。
#if !defined(STRING_LIST)
#define STRING_LIST
#include <string.h>
#include <stdlib.h>
typedef struct string_list
{
char **list;
int size;
void (*add)(struct string_list *list, char *string);
} string_list;
void add(string_list *list, char *string)
{
int old_size = list->size;
list->size += 1;
char **new_list = malloc(list->size);
if(!new_list)
{
puts("Error in malloc()");
}
for(int i = 0; i < old_size; i++) // assigning the elements from the old array to the new array
new_list[i] = list->list[i];
if (list->list != NULL)
free(list->list);
list->list = new_list;
list->list[list->size - 1] = strdup(string);
}
string_list *string_list_construct()
{
string_list *list = malloc(sizeof(string_list));
list->size = 0;
list->list = NULL;
list->add = add;
}
void string_list_deconstruct(string_list *list)
{
for(int i = 0; i < list->size; i++)
{
printf("i:%i\n", i);
free(list->list[i]);
}
free(list->list);
free(list);
}
#endif
这是主要功能
#include <stdio.h>
#include "string_list.h"
int main()
{
string_list *list = string_list_construct();
for(int i = 0; i < 5; i++)
{
list->add(list, "item");
printf("new size: %i\n\n", list->size);
}
string_list_deconstruct(list);
return 0;
}
动态列表是一个结构体,有两个数据字段和一个指向下面添加函数的函数指针。
当 运行 我得到代码时
new size: 1
new size: 2
new size: 3
new size: 4
malloc(): corrupted top size
Aborted
我使用 valgrind 检查内存泄漏,但我什么也没发现。
有什么帮助吗?
你需要区分array
的size
和length
,如果你想扩展一个数组,你可以使用realloc()
。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *strdup(const char *src) {
char *dst = malloc(strlen (src) + 1);
if (dst == NULL) return NULL;
return strcpy(dst, src);
}
typedef struct string_list
{
char **list;
unsigned int length;
size_t size;
void (*add)(struct string_list *list, char *string);
} string_list;
void add(string_list *stringlist, char *string)
{
int old_size = stringlist->size;
stringlist->length += 1;
stringlist->size += sizeof(char*);
stringlist->list = realloc( stringlist->list, sizeof( char* ) * stringlist->length );
if(!stringlist->list)
{
puts("Error in realloc()");
exit(1);
}
stringlist->list[stringlist->length-1 ] = strdup(string);
}
string_list *string_list_construct()
{
string_list *list = malloc(sizeof(string_list));
list->size = 0;
list->list = NULL;
list->add = add;
return list;
}
void string_list_deconstruct(string_list *list)
{
for(int i = 0; i < list->length; i++)
{
printf("free() i-th entry:%d\n", i);
free(list->list[i]);
}
free(list->list);
free(list);
}
int main()
{
string_list *list = string_list_construct();
for(int i = 0; i < 5; i++)
{
list->add(list, "item");
printf("new length: %d\n", list->length);
printf("new size: %ld\n\n", list->size );
}
string_list_deconstruct(list);
return 0;
}
我正在写一个动态列表。
这是包含动态列表的头文件和将元素添加到列表的函数。
#if !defined(STRING_LIST)
#define STRING_LIST
#include <string.h>
#include <stdlib.h>
typedef struct string_list
{
char **list;
int size;
void (*add)(struct string_list *list, char *string);
} string_list;
void add(string_list *list, char *string)
{
int old_size = list->size;
list->size += 1;
char **new_list = malloc(list->size);
if(!new_list)
{
puts("Error in malloc()");
}
for(int i = 0; i < old_size; i++) // assigning the elements from the old array to the new array
new_list[i] = list->list[i];
if (list->list != NULL)
free(list->list);
list->list = new_list;
list->list[list->size - 1] = strdup(string);
}
string_list *string_list_construct()
{
string_list *list = malloc(sizeof(string_list));
list->size = 0;
list->list = NULL;
list->add = add;
}
void string_list_deconstruct(string_list *list)
{
for(int i = 0; i < list->size; i++)
{
printf("i:%i\n", i);
free(list->list[i]);
}
free(list->list);
free(list);
}
#endif
这是主要功能
#include <stdio.h>
#include "string_list.h"
int main()
{
string_list *list = string_list_construct();
for(int i = 0; i < 5; i++)
{
list->add(list, "item");
printf("new size: %i\n\n", list->size);
}
string_list_deconstruct(list);
return 0;
}
动态列表是一个结构体,有两个数据字段和一个指向下面添加函数的函数指针。
当 运行 我得到代码时
new size: 1
new size: 2
new size: 3
new size: 4
malloc(): corrupted top size
Aborted
我使用 valgrind 检查内存泄漏,但我什么也没发现。
有什么帮助吗?
你需要区分array
的size
和length
,如果你想扩展一个数组,你可以使用realloc()
。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *strdup(const char *src) {
char *dst = malloc(strlen (src) + 1);
if (dst == NULL) return NULL;
return strcpy(dst, src);
}
typedef struct string_list
{
char **list;
unsigned int length;
size_t size;
void (*add)(struct string_list *list, char *string);
} string_list;
void add(string_list *stringlist, char *string)
{
int old_size = stringlist->size;
stringlist->length += 1;
stringlist->size += sizeof(char*);
stringlist->list = realloc( stringlist->list, sizeof( char* ) * stringlist->length );
if(!stringlist->list)
{
puts("Error in realloc()");
exit(1);
}
stringlist->list[stringlist->length-1 ] = strdup(string);
}
string_list *string_list_construct()
{
string_list *list = malloc(sizeof(string_list));
list->size = 0;
list->list = NULL;
list->add = add;
return list;
}
void string_list_deconstruct(string_list *list)
{
for(int i = 0; i < list->length; i++)
{
printf("free() i-th entry:%d\n", i);
free(list->list[i]);
}
free(list->list);
free(list);
}
int main()
{
string_list *list = string_list_construct();
for(int i = 0; i < 5; i++)
{
list->add(list, "item");
printf("new length: %d\n", list->length);
printf("new size: %ld\n\n", list->size );
}
string_list_deconstruct(list);
return 0;
}