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循环中起作用,而不是在函数调用中...看着调试器,指针指向错误的东西......
答案 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].ival
和d[i] -> ival
都不起作用的原因。
我认为最适合您的解决方案是使用STL中的std::vector
。