[英]Limitations of a typedef in header, struct defined in source
因此,我得到了一个头文件,其中包含结构的typedef
我必须在源文件中定义上述结构,但无法修改标题
这会对我创建的任何这些结构施加什么样的限制?
在我的头文件中
typedef struct tldnode TLDNode;
在我的源文件中
struct tldnode
{
int count;
char *tld;
TLDNode *left;
TLDNode *right;
};
运行程序时出现段错误,并使用GDB在故障点发现了我可以打印任何TLDNode成员的值的原因,因为我无法访问内存位置
如我在顶部提到的那样,这是否与结构定义的方式有关?
奇怪的是,TLDNode指针的内存位置与第一个成员的位置(int计数)相同,我很确定这意味着我在内存分配方面搞砸了,但不确定
指向的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...
}
在第三个源文件中,可以用getTld(node)
替换node->tld
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.