Почему я получаю realloc (): неверная ошибка следующего размера для этого кода? - PullRequest
1 голос
/ 10 марта 2019

Я набрал этот код, и когда я компилирую код, он выглядит нормально, но когда я выполняю исполняемый файл, как только я иду в место, соответствующее этому файлу, приложение закрывается, и я получаю realloc(): Invalid next size Aborted (core dumped).Может кто-нибудь сказать мне правильный код и сказать, почему?Эта проблема меня раздражала некоторое время.Ох, и HTFAR обозначает Массив функций раздела справки .Так что.Я пытаюсь сделать справочный центр для моего грабежа Minecraft

#include "DisplayHelp.h"
#include <stdlib.h>
#define NOTHING
#define molloc(arg) malloc(arg)
GtkWidget(*List)=NULL;
void (**HTFAR)(void);
uint NumberOfT = 0;

void HelpNewTemplate(const char *Title, const char *Text) {

}

void HelpAbout(void) {
    char *Text ="<span font=\"24\">FakeCraft\n\nCreator: Asadefa\n\nVersion: 1.0.0</span>";
    GtkWidget (*Dialog) = gtk_message_dialog_new(GTK_WINDOW(Window), 1, 0, 2, EMPTYSTRING);
    gtk_message_dialog_set_markup(GTK_MESSAGE_DIALOG(Dialog), Text);
    gtk_window_set_title(GTK_WINDOW(Dialog), "About");
    gtk_window_set_position(GTK_WINDOW(Dialog), 0);
    gtk_dialog_run(GTK_DIALOG(Dialog));
    gtk_widget_destroy(Dialog);
}

void HelpPlacingBlocks(void) {
    printf("sadf\n");
}

void HelpMiningBlocks(void) {
    printf("asdf\n");
}

void HelpCrafting(void) {

}

void HelpSmelting(void) {

}

void HelpShowTopic(void) {
    GtkListBoxRow (*SRow);
    SRow = gtk_list_box_get_selected_row(GTK_LIST_BOX(List));
    if(SRow != NULL NOTHING NOTHING NOTHING NOTHING NOTHING){
        unsigned int NRow = gtk_list_box_row_get_index(SRow);
        (*HTFAR[NRow])();
    }else{

    }
}

void AddHT(const char *Name, GtkWidget (*Label), void(HTF)(void)) {
    const char *TFormat = ("<span font=\"16\">%s</span>");
    char *Format = g_markup_printf_escaped(TFormat, Name);
    Label = gtk_label_new(NULL NOTHING NOTHING NOTHING);
    gtk_widget_set_halign(Label, GTK_ALIGN_START);
    gtk_widget_set_margin_start(Label, 0x0000010);
    gtk_widget_set_margin_top(Label, 0x000008);
    gtk_widget_set_margin_bottom(Label, 0x000008);
    gtk_label_set_markup(GTK_LABEL(Label), Format);
    gtk_container_add(GTK_CONTAINER(List), Label);
    HTFAR = realloc(HTFAR,sizeof(void*));
    HTFAR[NumberOfT] = &HTF;
    NumberOfT += 0x1;
    printf("Added HT %s\n", Name);
    g_free(Format);
}
//Handle Size 
void DisplayHelp(void) {
    HTFAR = molloc(0x00);
    gtk_main_quit(NOTHING);
    gtk_widget_destroy(Box);
    Box = gtk_grid_new(NOTHING);
    gtk_grid_set_row_homogeneous(GTK_GRID(Box), TRUE);
    gtk_grid_set_column_homogeneous(GTK_GRID(Box), TRUE);
    gtk_container_add(GTK_CONTAINER(Window),Box NOTHING);

    List = gtk_list_box_new();
    GtkWidget (*ListC) = gtk_scrolled_window_new(NULL, NULL NOTHING);
    gtk_grid_attach(GTK_GRID(Box),ListC, 0x0, 0x0, 0x1, 0x8 NOTHING);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ListC), 2, 1);
    gtk_container_add(GTK_CONTAINER(ListC), List);

    GtkWidget (*Label) = NULL;
    GtkWidget (*Button) = NULL;
    GtkWidget (*Hbox) = gtk_box_new(0, 10);
    gtk_box_set_homogeneous(GTK_BOX(Hbox),1);
    Button = gtk_button_new_with_label("Done");
    gtk_container_set_border_width(GTK_CONTAINER(Hbox), 12);
    g_signal_connect(Button, "clicked", DisplayOptions, NULL);
    gtk_grid_attach_next_to(GTK_GRID(Box),Hbox,ListC,3, 1, 2);
    gtk_box_pack_end(GTK_BOX(Hbox), Button, 1, 1, FALSE);
    AddHT("Placing Blocks", Label, HelpPlacingBlocks);
    AddHT("Mining Blocks", Label, HelpMiningBlocks);
    AddHT("Crafting", Label, HelpCrafting);
    AddHT("Smelting", Label, HelpSmelting);
    AddHT("About", Label, HelpAbout);
    free(HTFAR);

    Button = gtk_button_new_with_label("Show Topic");
    gtk_box_pack_start(GTK_BOX(Hbox), Button, 1, 1, FALSE);
    g_signal_connect(Button,"clicked",HelpShowTopic, NULL);

    Label = gtk_label_new(EMPTYSTRING);
    char *TXT  =  ("<span font = \"16\">Help Center</span>");
    gtk_grid_attach_next_to(GTK_GRID(Box),Label,ListC,2,1,1);
    gtk_label_set_markup(GTK_LABEL(Label), TXT);
    printf(ESSTR, "Help" NOTHING);
    gtk_widget_show_all(Window);
    gtk_main();
}

Почему это происходит и какой код ввести правильно?

1 Ответ

2 голосов
/ 10 марта 2019
HTFAR = realloc(HTFAR,sizeof(void*));

должно быть

HTFAR = realloc(HTFAR,sizeof(void(*)(void))*(NumberOfT+1));

Вы получили конкретную ошибку, которую сделали, потому что realloc переместил блок, и вы перезаписали блок после того, который был возвращен (я думаю) malloc (0x0).

...