2012-04-10 65 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