2013-10-17 27 views
1

所以,我一直在考慮一個包含結構限制,在源結構定義

我必須定義說,一個源文件結構,我無法修改頭typedef的頭文件

這對我創建的任何這些結構施加了什麼樣的限制?

在我的頭文件我有

typedef struct tldnode TLDNode; 

在我的源文件,我有

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

我跑的時候我的程序,並使用GDB我在的點發現得到段錯誤故障我無法打印任何TLDNode成員的值,因爲我無法訪問內存位置

這是與結構定義方式相關的,就像我在頂部提到的那樣,或者可能是別的東西?

一個奇怪的說明,TLDNode指針的存儲位置是相同的位置,作爲第一個成員(詮釋計數),我敢肯定,這意味着我搞砸了某個地方內存分配,但不知道

+0

什麼是'結構tldlist'的typedef您提供和'結構tldnode'結構定義你提供什麼關係呢? –

+0

比較遺憾的是,只是一個錯誤,意思是TLDNode,固定的 – user1079404

+0

您可以添加導致段錯誤代碼的樣本。有一個與你正在嘗試,如果你想從源文件外部訪問節點的成員除了做沒有實際限制。 – Lohrun

回答

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... 
} 

而且在你的第三個源文件,你可以通過getTld(node)代替node->tld

+0

謝謝,非常明確的解釋 – user1079404

+1

不一定是下一個結構成員,不要忘了[結構打包](http://stackoverflow.com/questions/4306186/structure-padding-and-structure-packing) – fvdalcin

+0

對,我會糾正我的答案 – Lohrun