所以,我得到了一个包含结构的typedef的头文件
我必须在源文件中定义所述结构,我无法修改标题
这对我创造的任何结构都施加了什么样的限制?
在我的头文件中,我有
typedef struct tldnode TLDNode;
在我的源文件中我有
struct tldnode
{
int count;
char *tld;
TLDNode *left;
TLDNode *right;
};
运行程序时遇到段错误,使用GDB我发现故障点我可以打印任何TLDNode成员的值,因为我无法访问内存位置
这与结构的定义方式有关,就像我在顶部提到的那样,或者可能是其他东西?
奇怪的是,TLDNode指针的内存位置与第一个成员(int count)的位置相同,我很确定这意味着我搞砸了内存分配的地方但不确定
答案 0 :(得分:2)
指向的struct tldnode
的内存位置与tldnode的第一个成员的内存位置相同。
这是由于结构成员的内存布局:每个成员都在一个足够大的内存块中与其他成员分配,以包含所有成员。内存块的大小是结构的大小。
举一个例子,它可能更清楚:
struct X {
int a;
int b;
};
struct X x;
printf("%p\n", &x); // some address
printf("%p\n", &x.a); // same address
printf("%p\n", &x.b); // same address + 4 (provided that int are stored on 4 bytes)
错误可能在其他地方。
您似乎想要从第三个源文件访问TLDNode类型指针的内容。简而言之,你不能,你不知道typedef struct tldnode TLDNode背后隐藏着什么。它可能会更好。
如果要从(TLDNode *)内部访问tld指针,则需要添加一个getter函数,该函数将使用结构的内部知识将其传递给您。
在标题中添加类似
的内容char * getTld(TLDNode * node);
在您拥有的源文件中,添加此函数的定义。
char * getTld(TLDNode * node)
{
return node->tld; // NULL check maybe...
}
在第三个源文件中,您可以将node->tld
替换为getTld(node)
。