【发布时间】: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(">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
这是输出:
我不明白为什么地址会改变,或者我做错了什么愚蠢的错误...... 有人有想法吗? 不要犹豫,要求更多代码
谢谢
【问题讨论】:
-
代码太多。使用调试器缩小问题范围。
-
已编辑,仅留下可能导致错误的内容。更好?
-
gtkArg的类型是什么?sizeof(*gtkArg)是什么?sizeof(GTKObjStore)是什么?你为什么要隐藏store_filename()中的argument参数?此外,您可以使用g_malloc0()或g_new0()(由GTK+ 使用的GLib 提供)分配和归零内存。 -
我输入了 gtkArg 的类型。这是一个结构。为什么我投了反对票?没有解释只是投反对票。我的问题对我来说似乎并不愚蠢
-
这听起来对我来说也不愚蠢,但我试图根据您提供的内容排除潜在的错误来源。现在的最后一个问题(因为我必须离开):是
argument->weightsInHidNULL,还是argument->weightsInHid[0]NULL,还是argument->weightsInHid[0][0]NULL?
标签: c pointers segmentation-fault gtk arguments