【问题标题】:Pointers, arrays, and structs (and allocating memory)?指针、数组和结构(以及分配内存)?
【发布时间】:2012-04-10 05:13:23
【问题描述】:

好的,这可能真的很简单,但是我查看了有关指针、数组和内存分配的整个网站,但有些解释对我来说有点太复杂了。那么......有人可以向我解释为什么 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 循环中有效,但在函数调用中无效...查看调试器,指针指向错误的地方...

【问题讨论】:

    标签: c++ arrays pointers struct


    【解决方案1】:

    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 本身,只是它指向的东西,你甚至可以通过 value 传递它:

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

    或者更确切地说,您应该使用std::vector&lt;data_t&gt; 而根本不使用any 指针。 (另外,你不应该键入data_t 的类定义。)

    【讨论】:

    • 太棒了,这正是问题所在......现在我将如何将 int i 更改为 sval?这是错误的,但是一个例子 sval = ('$' + char(i+1) + '\0');
    • @Sun:将char* 更改为std::string
    • 是的,我知道这会起作用,但这实际上是为了面试测试......要求等等我100%确定他们希望我在某处使用 malloc() ,因为它被提到了。 ..
    • @Sun:如果是 C++ 面试,他们问你char*malloc,不要接受这份工作。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 2023-04-02
      • 2019-09-23
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 2013-04-18
      相关资源
      最近更新 更多