作为参数传递的指针地址似乎在函数调用中发生变化

时间:2014-12-07 15:39:24

标签: c pointers segmentation-fault gtk arguments

嗯,这可能是我最后一个被阻止询问的问题,但我看不出是什么问题。

我目前正在尝试将指针传递给结构作为参数,这是结构。

typedef struct GTKObj
{
    GtkFileSelection *file_selector;
    double ***weightsInHid;
    double **weightsHidOut;
    double **trainingOutput;
} GTKObjStore;

在main.c中,我有三个数组(命名为结构中的那个),但由于它们没有动态分配,我没有找到任何方法来填充GTKBojStore没有memcpy()

//main.c
GTKObjStore *gtkArg = malloc(sizeof(*gtkArg));

然后,我必须在GTK回调函数中传递它们,但是当我尝试访问其中一个元素时,我有一个段错误。所以我试着打印一些地址来看,它们永远都不一样。

//main.c
printf("gtkArg before passing it     :  %p\n", gtkArg);
printf("&gtkArg before passing it    :  %p\n", &gtkArg);
g_signal_connect(G_OBJECT(pButton),
        "clicked",
        G_CALLBACK(creer_file_selection), gtkArg); <<-- Here

在函数中,我再次打印:

void store_filename (GTKObjStore *testData)
{
    printf("Passing... gtkArg -> argument\n");
    printf("&argument not casted in struct :  %p\n", &testData);
    GTKObjStore *argument = testData;
    printf("argument      casted in struct :  %p\n", argument);
    printf("&argument     casted in struct :  %p\n", &argument);
    printf("%d - %d - %d -%f\n",i,j,k, argument->weightsInHid[0][0][0]); //<<--Segfault

这是输出:

Output

我不明白为什么地址会发生变化,或者我可能会做一些愚蠢的错误...... 有人有想法吗? 不要犹豫,要求提供更多代码

谢谢

1 个答案:

答案 0 :(得分:0)

首先,请不要粘贴输出图片。它们很难切割/粘贴。以 text 形式显示输出。

其次,你对指针的地址有所关注:&gtkArg&testData&argument,但它们都是无关的

重要的是传递给store_filename()的参数的。它应该是0x21d1220,但您会得到0x2328870的意外值。你应该问的真正问题是:为什么你得到了那个价值?

现在,您已将creer_file_selection()注册为回调。据推测, it 接收到正确的数据值,然后使用不正确的值调用store_filename()。但是,您永远不会显示creer_file_selection()(或creer_file_selection()store_filename()之间的任何函数)的代码。该错误可能出现在其中一个中间函数中。

调试此问题的最佳方法是使用调试器。在GDB下运行程序直到崩溃点,然后使用GDB where命令,并观察使用哪些参数调用哪些函数。您应该观察到回调:creer_file_selection()是使用期望参数调用的,但调用链中的某些函数不是。使用错误参数调用的函数的调用者......可能是错误所在的位置。