繁体   English   中英

标头中的typedef的限制,源中定义的结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM