[英]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
,如果要擴展array
,可以使用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;
strcpy(dst, src);
return dst;
}
typedef struct string_list
{
char **list;
unsigned int length;
long unsigned int 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*);
if( stringlist->length == 1 )
{
stringlist->list= malloc( sizeof(char*) * stringlist->length);
if(!stringlist->list )
{
printf( "Error at malloc()" );
exit(1);
}
}else
{
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.