1

所以,我得到了一个包含结构类型定义的头文件

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

这对我创建的这些结构中的任何一个施加了什么样的限制?

在我的头文件中,我有

typedef struct tldnode TLDNode;

在我的源文件中,我有

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

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

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

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

4

1 回答 1

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->tldgetTld(node).

于 2013-10-17T20:48:20.567 回答