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

时间:2013-10-17 20:25:38

标签: c struct header typedef

所以,我得到了一个包含结构的typedef的头文件

我必须在源文件中定义所述结构,我无法修改标题

这对我创造的任何结构都施加了什么样的限制?

在我的头文件中,我有

typedef struct tldnode TLDNode;

在我的源文件中我有

struct tldnode
{
    int count;
    char *tld;
    TLDNode *left;
    TLDNode *right;
};

运行程序时遇到段错误,使用GDB我发现故障点我可以打印任何TLDNode成员的值,因为我无法访问内存位置

这与结构的定义方式有关,就像我在顶部提到的那样,或者可能是其他东西?

奇怪的是,TLDNode指针的内存位置与第一个成员(int count)的位置相同,我很确定这意味着我搞砸了内存分配的地方但不确定

1 个答案:

答案 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)