2012-04-10 104 views
1

好吧,這可能很簡單,但我查看了指針,數組和內存分配的所有網站,但對我來說,一些解釋有點太複雜。所以...有人可以向我解釋爲什麼d [i]在下面的代碼中指向不同的東西?指針,數組和結構(並分配內存)?

typedef struct data_t { 
    int ival; 
    char *sval; 
} data_t; 

void f1(data_t **d); 
int main() 
{ 
data_t *d; 
    d = new data_t[500]; 
    for (int i=0; i<500; i++) 
    { 
     d[i].ival= i+1; 
     d[i].sval="$"; 
    } 

    f1(&d); 
} 

void f1(data_t **d) 
{ 
    for (int i=0; i<500; i++) 
    { 
     d[i]->ival=i+1; 
     d[i]->sval="$"; 
    } 
} 

雖然我需要做的是填入每個陣列的500個元素,使得所述整數字段「IVAL」具有用於數組索引0-499的值1-500,和字符串字段「 sval'包含數組索引0-499的字符串「$ 1」 - 「$ 500」。在函數調用中。

也:是

d = new data_t[500] 

所有我需要對結構的500元件陣列分配內存?

只是想弄清楚爲什麼它在工作在主循環中,而不是在函數調用...看指針的東西的方式指向錯誤調試器...

回答

4

「它的工作原理「在main中,因爲d[i]*(d + i)相同。在你的函數f1d是一個指針的指針,所以你需要說(*d)[i].ival等。(你寫什麼,d[i],由i措施推進指針的指針,然後嘗試取消引用,這是。南轅北轍)

話又說回來,既然你在C++的時候,你應該可能只是已通過指針作爲參考:

void f2(data_t * & d) // <--- reference to the original pointer 
{ 
    // ... 
    d[i].ival = i + 1; 
} 

或實際,因爲你永遠不會改變原有d本身,只有它到,你甚至可以傳遞:

void f3(data_t * d)  // <--- pointer passed by value 
{ 
    // as before, d[i].ival etc. 
} 

或者說,你應該使用std::vector<data_t>,並且不使用任何指針在所有。 (另外,您不應輸入您的類定義data_t。)

+0

真棒這是完全問題... 現在我將如何去改變詮釋我到sval?這是錯誤的,但一個例子 sval =('$'+ char(i + 1)+'\ 0'); – Sun 2012-04-10 05:28:36

+0

@Sun:將'char *'改爲'std :: string'。 – 2012-04-10 05:31:06

+1

是的我知道這將工作,但這實際上是一個面試測試...需求和whatnot 我100%確定他們希望我使用malloc()因爲它的提到... – Sun 2012-04-10 05:38:15

1

您的函數f1等待**類型的參數(即數組的數組或單個矩陣)。 所以,當你寫d [i]它不是一個單一的元素,但它是一個數組(矩陣的行)。這就是爲什麼d[i].ivald[i] -> ival都不起作用。 我認爲最適合您的解決方案是使用STL的std::vector