[英]Pointers, arrays, and structs (and allocating memory)?
好吧,这可能真的很简单,但我在整个网站上都查看了有关指针、arrays 和 memory 分配的信息,但有些解释对我来说有点太复杂了。 那么...有人可以向我解释为什么 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 个元素中的每一个,这样 integer 字段 'ival' 的数组索引 0-499 的值为 1-500,并且字符串字段 'sval' 包含字符串“$1 ” – 数组索引 0-499 为“$500”。 在 function 电话中。
也是
d = new data_t[500]
我需要为 500 个元素的结构数组分配 memory 吗?
只是想弄清楚为什么它在 main 的 for 循环中起作用,但在 function 调用中不起作用...查看调试器,指针指向错误的地方...
“有效”在main
中是因为d[i]
与*(d + i)
相同。 在您的 function 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.
}
或者更确切地说,您应该使用std::vector<data_t>
而根本不使用任何指针。 (此外,您不应该对 data_t 的data_t
定义进行类型定义。)
您的 function f1
等待 ** 类型的参数(即 arrays 的数组,或只是一个矩阵)。 因此,当您编写 d[i] 时,它不是单个元素,而是一个数组(矩阵的行)。 这就是为什么d[i].ival
和d[i] -> ival
都不起作用的原因。 我认为最适合您的解决方案是使用 STL 中的std::vector
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.