指针,数组和结构(以及分配内存)?

时间:2012-04-10 05:13:24

标签: c++ arrays pointers struct

好吧,这可能非常简单,但我在整个网站上都看到了有关指针,数组和内存分配的内容,但有些解释对我来说有点过于复杂。所以...有人可以向我解释为什么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'的值为1-500,数组索引为0-499,字符串字段'sval'包含字符串“$ 1” - 数组索引0-499的“$ 500”。在函数调用中。

也是:是

d = new data_t[500]

我需要为500个元素的结构数组分配内存吗?

只是想弄清楚为什么它在main中的for循环中起作用,而不是在函数调用中...看着调试器,指针指向错误的东西......

2 个答案:

答案 0 :(得分:4)

“工作正常”main,因为d[i]*(d + i)相同。在你的函数f1中,d是一个指向指针的指针,所以你需要说(*d)[i].ival等。(你所写的,d[i]正在推进指针指向指针按i步骤,然后尝试取消引用 ,这是错误的方法。)

然后,再次,因为你在C ++中,你可能应该只是将指针作为参考传递:

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

或者实际上,由于您永远不会更改原始d本身,只会更改指向的内容,您甚至可以通过传递它:< / p>

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

或者更确切地说,你应该使用std::vector<data_t>而不是使用任何指针。 (另外,你不应该输入data_t的类定义。)

答案 1 :(得分:1)

你的函数f1等待**类型的参数(即数组数组,或只是一个矩阵)。 因此,当你写d [i]时,它不是单个元素,而是一个数组(矩阵的行)。这就是为什么d[i].ivald[i] -> ival都不起作用的原因。 我认为最适合您的解决方案是使用STL中的std::vector