繁体   English   中英

指针、arrays 和结构(以及分配内存)?

[英]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].ivald[i] -> ival都不起作用的原因。 我认为最适合您的解决方案是使用 STL 中的std::vector

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM