为什么我得到realloc():此代码的下一个大小错误无效?

问题描述 投票:1回答:1

我输入了这段代码,当我编译代码时,它看起来很好但是当我执行可执行文件时,一旦我转到对应于此文件的位置,应用程序退出并获得realloc(): Invalid next size Aborted (core dumped)。有人可以告诉我正确的代码并说出原因吗?这个问题让我烦恼了一段时间。哦,HTFAR代表帮助主题功能数组。所以那里。我正在努力建立一个帮助中心,以获取我的我的技术

#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();
}

为什么会发生这种情况?键入的代码是什么?

c sizeof realloc memory-movement
1个回答
2
投票
HTFAR = realloc(HTFAR,sizeof(void*));

应该

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

你得到了你所做的具体错误,因为realloc移动了块,你在(我认为)malloc(0x0)返回的块之后覆盖了块。

© www.soinside.com 2019 - 2024. All rights reserved.