【问题标题】:Pointer Address passed as argument seems to change in function call作为参数传递的指针地址似乎在函数调用中发生了变化
【发布时间】:2014-12-07 15:39:23
【问题描述】:

好吧,这可能是我被阻止提问之前的最后一个问题,但我就是看不出问题所在。

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

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

这是输出:

我不明白为什么地址会改变,或者我做错了什么愚蠢的错误...... 有人有想法吗? 不要犹豫,要求更多代码

谢谢

【问题讨论】:

  • 代码太多。使用调试器缩小问题范围。
  • 已编辑,仅留下可能导致错误的内容。更好?
  • gtkArg的类型是什么? sizeof(*gtkArg) 是什么? sizeof(GTKObjStore) 是什么?你为什么要隐藏store_filename() 中的argument 参数?此外,您可以使用g_malloc0()g_new0()(由GTK+ 使用的GLib 提供)分配和归零内存。
  • 我输入了 gtkArg 的类型。这是一个结构。为什么我投了反对票?没有解释只是投反对票。我的问题对我来说似乎并不愚蠢
  • 这听起来对我来说也不愚蠢,但我试图根据您提供的内容排除潜在的错误来源。现在的最后一个问题(因为我必须离开):是argument-&gt;weightsInHid NULL,还是argument-&gt;weightsInHid[0] NULL,还是argument-&gt;weightsInHid[0][0] NULL?

标签: c pointers segmentation-fault gtk arguments


【解决方案1】:

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

其次,你对指针的地址很感兴趣:&amp;gtkArg&amp;testData&amp;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() 是使用预期参数调用的,但调用链中的某些函数不是。使用错误参数调用的函数的调用者......很可能是错误所在。

【讨论】:

  • 好的,感谢您的建设性回答,我一回到家就检查一下
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多