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”的值 1-500 用于数组索引 0-499,而字符串字段“sval”包含字符串“$1 ” – 数组索引 0-499 的“$500”。在函数调用中。

也是

d = new data_t[500]

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

只是想弄清楚为什么它在 main 的 for 循环中起作用,但在函数调用中不起作用……查看调试器,指针指向错误的地方……

4

2 回答 2

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本身,只有它指向的内容,您甚至可以按传递它:

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

或者更确切地说,您可能应该使用 astd::vector<data_t>而根本不使用任何指针。(另外,你不应该 typedef 你的类定义data_t。)

于 2012-04-10T05:19:21.077 回答
1

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

于 2012-04-10T05:36:54.720 回答