簡體   English   中英

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 來解決內存泄漏問題,但我一無所獲。

有什么幫助嗎?

您需要區分arraysizelength ,如果要擴展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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM