嗯,这可能是我最后一个被阻止询问的问题,但我看不出是什么问题。
我目前正在尝试将指针传递给结构作为参数,这是结构。
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(">kArg before passing it : %p\n", >kArg);
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
这是输出:
我不明白为什么地址会发生变化,或者我可能会做一些愚蠢的错误...... 有人有想法吗? 不要犹豫,要求提供更多代码
谢谢
答案 0 :(得分:0)
首先,请不要粘贴输出图片。它们很难切割/粘贴。以 text 形式显示输出。
其次,你对指针的地址有所关注:>kArg
,&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()
是使用期望参数调用的,但调用链中的某些函数不是。使用错误参数调用的函数的调用者......可能是错误所在的位置。