由于在使用GTK的g_signal_connect时传递指针的内存地址发生了变化,我遇到了分段错误。
这只发生在我的三台电脑中。它不运行的一台计算机正在运行Arch Linux,因此我假设某些程序的版本优于其他运行Fedora的计算机。我以为它是GTK +,所以我尝试降级,这没有任何影响。
奇怪的是......无论我在哪里编译程序,它总是在两台计算机上工作,并且不能在一台计算机上工作,所以我不相信它与编译器版本有任何关系。
标题文件:
<xsl:copy-of select="$myvar/output/Line[MyDate!='99991231']"/>
主:
typedef struct Timer {
gboolean running;
} *TimerP;
typedef struct TimerData {
TimerP timerPointer;
} *TimerDataP;
startTimerPressed函数:
TimerP timerPointer;
timerPointer = malloc(sizeof(struct Timer));
TimerDataP timerDataP;
timerDataP = malloc(sizeof(struct TimerData));
timerDataP->timerPointer = timerPointer;
g_signal_connect (startButton, "clicked", G_CALLBACK (startTimerPressed), timerDataP);
为了测试,我一直在做这个,这似乎在main中无处不在:
static void startTimerPressed (GtkWidget *widget, gpointer data, TimerDataP timerData) {
TimerP timer = timerData->timerPointer;
}
但由于某种原因,当使用回调调用它时,内存位置已经改变,内部的所有数据都搞乱了,所以尝试访问任何东西都会导致分段错误。
请&amp;谢谢你的帮助!
完整示例:
gpointer theGPointer;
startTimerPressed(startButton, theGPointer, timerDataP);
在我的两台计算机上,两个位置打印的内存位置相同,其中一个位置不同
答案 0 :(得分:1)
static void startTimerPressed (GtkWidget *widget, gpointer data, TimerDataP timerData) {
gpointer data
参数 您传递给g_signal_connect()
的数据。您要求的参数多于clicked
信号给出的参数。遗憾的是,无法检查信号功能参数:/你想要
static void startTimerPressed (GtkWidget *widget, TimerDataP timerData) {
或
static void startTimerPressed (GtkWidget *widget, gpointer data) {
TimeDataP timerData = (TimerDataP) data;
代替。