我在C中使用树来跟踪未定义和不同数量的输入字段。我有一个具有一定数量字段的结构如下:
struct mystruct {
int id, mpid;
char *name;
struct myotherstruct *myostr;
};
我有一个这种类型的指针实例(mystruct)我分配了内存,然后我用输入我从文件中读取这些结构值。然后我使用search.h中的tsearch函数将我的mystruct对象添加到mystruct树中。我遇到的问题是,如果我使用tfind函数从树中检索mystruct指针,则返回的mystruct内存没有重新收集我分配的myotherstruct指针数据,并在添加到之前创建值时指向该指针数据。那个树。
一般顺序如下:
struct mystruct {
int id, mpid;
char *name;
struct myotherstruct *myostr;
};
struct myotherstruct {
int spid;
};
// allocate memory to temporary mystruct pointer
// add mpid field to mystruct pointer ( used in comparison function )
if( // tfind == NULL )
{
// set id value
// allocate char memory and strncpy correct value in
// allocate myotherstruct memory and assign all values
// tsearch for this newly created mystruct memory chunk so that it is added to tree
}
else
{
// fails here when attempting to access the data returned by mytfind
}
...
使用gdb,程序第一次非常清楚地进入if循环(因为树是空的)并创建一个有效且完整的mystruct指针,并且具有适当的内存分配。当tsearch返回它的输出时,内存位置与我填充的mystruct指针的内存位置不同,然后我无法为mystruct-> myotherstruct变量(如spid)进行打印。尝试在gdb中打印时得到的确切输出是:无法访问地址0x的内存-----其中-s是内存中我显然无法访问的各种位置。
我怀疑我的比较函数可能存在问题,因为我只是比较mystruct mpid字段来确定是否存在一个树节点还是一个mystruct对象,但是我对C和tsearch / tfind功能的缺乏经验表明在这里希望有更多经验的人能够帮助我,因为在各种tsearch.h网页上提供的示例不能处理非常复杂的示例。在此先感谢您的帮助!
PS:代码必须保留在C中,因此语言交换不够:(
编辑:
这是我的比较功能:
int distcmp(const void *a, const void *b){
return ((int)((struct mystruct *)a)->mpid) != (int)(((struct mystruct *)b)->mpid);
}
另外,我最初使用tfind是因为我想知道树中是否存在特定值。如果它不存在(它返回NULL),则它进入if循环并填充新的mystruct对象并将其添加到树中(使用tsearch)。如果它已经存在,则指向该对象的指针来自tfind,我将其分配给mystruct指针并在代码的else部分中使用。希望这会有所帮助。再次感谢。
解决:
只是为了更新,问题是来自tsearch和tfind的返回指针不是mystruct类型。它是指向与我的搜索匹配的mystruct值的内存位置的指针。在这种情况下,通过使用*访问返回的指针并将该值传递给mystruct指针,可以解决该问题。感谢那些评论的人。