2012-11-07 121 views
2

我有以下結構裏面:如何創建一個指針結構

typedef struct bucket { 
    unsigned int contador; 
    unsigned int * valor; 
} Bucket; 

typedef struct indice { 
    unsigned int bs;    
    unsigned int valor;  
    unsigned int capacidade; 
    Bucket * bucket; 
} Indice; 

typedef struct tabela { 
    unsigned int bs; 
    Indice * indice; 
} Tabela; 

我想要做這樣的事情:

tabela->indice[2].bucket = &tabela->indice[0].bucket; 

,但我得到段錯誤。

我怎樣才能得到tabela->indice[0].bucket地址和聯繫到tabela->indice[2].bucket

謝謝!

+0

1)在struct中創建指針:就像你做的一樣。 2)在使用它之前,確保*每個*指針實際上*指向某個東西。確保你已經分配了*分配的每個對象 - 並正確指定了指針! – paulsm4

回答

2

我可能會得到負repped agian爲試圖回答一個C的問題,但在這裏不用什麼

你嘗試擺脫&的?

tabela->indice[2].bucket = tabela->indice[0].bucket; 
+1

我會對你輕鬆,但最有可能的情況是這些指針尚未初始化。儘管如此,我們不能肯定地說,所以我沒有-1 –

+0

@EdS。這就是我一開始要說的,但後來我更仔細地閱讀了這個問題,而且似乎他已經能夠使用這兩個值了。 –

+0

那麼,獲取未初始化指針的地址不會導致段錯誤並且完全有效。指針本身有一個有效的地址。解引用無效指針可能會導致段錯誤,所以這是我的猜測。 –

2

你必須初始化你的指針來指向某些有效的東西。簡單地創建一個你的結構實例並不適合你。例如:

Tabela t = {}; /* t is a valid, zero-initialized object, but indice is not valid */ 

t.indice = malloc(sizeof(Indice) * some_count); 
/* now t.indice is valid */ 

for(int i = 0; i < some_count; ++i) 
    t.indice[i].bucket = malloc(sizeof(Bucket)); 

/* now t.indice[0-(some_count-1)].bucket are all valid */ 

順便說一句,你的指針的副本是不正確。

tabela->indice[2].bucket = tabela->indice[0].bucket; 
/* assuming indices 0 and 2 are valid, this now works (but leaks memory) 
    note that I removed the &. It is incorrect and produces 
    a Bucket** because t.indice[n].bucket is already a pointer */ 

但是,這會導致內存泄漏。我很難弄清楚你實際想要在這裏完成什麼。