【问题标题】:How come I don't have to increment an array pointer whilst allocating values to it为什么我不必在为其分配值时增加数组指针
【发布时间】:2012-04-01 15:12:51
【问题描述】:

我有代码可以动态地将一个包含 100 个双精度的数组分配给一个指针,并用 1.0 到 100.0 的值初始化内存。

我的问题是,在下面的代码中,为什么我不必在 for 循环的每次迭代中编写 *ptr++。我试过了,还是不行。

void allocate_array(){
    double *ptr;
    ptr= (double*)malloc(sizeof(double)*100);
    int i=0;
    float j=0.0;
    for(i=0;i<100;i++){
        *ptr=j++;
        printf(" %0.1lf\n",*ptr);
    }
}

【问题讨论】:

  • 你不需要吗?您将 0.0, 1.0, ... 值全部分配给数组的第一个索引。而且你永远不会为其他索引分配任何东西。所以你确实输出了你想要的所有值,但你的数组看起来像:{99.0, ???, ???, ...}

标签: c pointers iteration


【解决方案1】:

好吧,你不必做任何事情。在您的代码中,您无需初始化整个数组 - 您只需为其第一个成员分配 100 个不同的值。你的代码就像:

double d;
for(i=0;i<100;i++){
            d=j++;
            printf(" %0.1lf\n",d);
}

如果要初始化整个数组,请执行以下操作:

double *temp=ptr;
for(i=0;i<100;i++){
            *temp=j++;
            printf(" %0.1lf\n",*temp++);
}

【讨论】:

  • @Mat 是的,但 OP 要求提供 *ptr++。 (这也是我写在printf的原因)
  • 但即使在这里,您每次分配某些东西时都不会迭代 *temp,为什么不 *temp++=j++ ?
  • @EoinMurray 我以为您想在增量之前打印值。 (可以一行完成,比如printf(" %0.1lf\n",*temp++=j++);
【解决方案2】:

这些都不重要,因为您没有将指针返回到您分配的内存;你只是在泄漏内存。

试试这样的:

double *allocate_array(size_t size)
{
  double *ptr = malloc(sizeof *ptr * size); // note no cast, operand of sizeof
  if (ptr)
  {
    size_t i;
    for (i = 0; i < size; i++)
    {
      ptr[i] = (double) (i+1);  // ptr[0] = 1.0, ptr[1] = 2.0, ptr[2] = 3.0, etc.
    }
  }
  return ptr;
}

你会这样称呼它

double *myArray = allocate_array(100);

当你完成数组后,你需要释放它:

free(myArray);

请注意,您想要在allocate_array 中做的一件事是更改ptr 的值,至少在不将该值保存在其他地方的情况下不会这样做;否则,您将无法正确free

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2016-11-04
    • 2019-09-28
    • 1970-01-01
    相关资源
    最近更新 更多