GTK + C:指针地址更改

时间:2016-05-25 17:10:11

标签: c pointers gtk gtk3

由于在使用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);

在我的两台计算机上,两个位置打印的内存位置相同,其中一个位置不同

1 个答案:

答案 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;

代替。