如何使用指针间接地从函数返回(动态分配的)数组



对不起,我今天花了大部分时间试图解决什么可能是一个简单的指针问题,想知道是否有人可以帮助。

我想要一个函数,它向main()返回一个数字和一个数组,因此需要对其中至少一个使用指针。数组必须在函数内部动态分配。

我已经在下面以简化的形式展示了我最好的尝试。我只得到"分割错误"。

double my_func(double **ptr);
int main(int argc, char **argv){
  double value;
  double *a;
  value = my_func(&a);
  printf("Value is %f array[1] is %f n", value, a[1]);
  return 0;
}
double my_func(double **ptr){
  int i;
  /* generate an array */
  void *memory = malloc(10*sizeof(double));
  if (memory == NULL){
    printf("ERROR: out of memoryn");
  }
  *ptr = (double *) memory;

  /* Fill the array with some values */
  for (i=0;i<10;i++)
  {
    **(ptr+i) = 42;
  }

  return 3.14;
}

[这样做的原因是我有一个读取文件的函数,我想将行数和包含文件内容的数组返回给main()。我希望它能动态地分配数组,这样程序就可以对任何大小的文件进行操作。[/p>

谢谢你的帮助!

下一行您将i添加到变量a的地址:

**(ptr+i) = 42;

要将i添加到错位地址中,需要先对ptr解引用:

*(*ptr+i) = 42;

除了@ygram的答案,我发现通过使用辅助变量

有助于简化分配函数(示例中的my_func)中的事情:
double myfunc(double **a_dp) {
    int i;
    double *dp;
    dp = malloc(10 * sizeof *dp);
    /* no cast required for malloc in C, but make sure you #include <stdlib.h> */
    if (dp == NULL) {
        ... handle error ...
    }
    *a_dp = dp;
    for (i = 0; i < 10; i++)
        dp[i] = 42;
    return 3.14;
}

也就是说,不必重复写*(*ptr + index)(*ptr)[index],而是创建一个局部变量来保存您也将存储到*ptr中的值-这里我将该局部变量称为dp -然后您只需在本地使用dp,除了(一个或有时几个)必须存储值以便调用者接收它的地方。

数组和数字之间是什么关系?为了简单起见,把它们放在一个结构体中不是更好吗?把这里的东西清理干净真的会很有帮助。

typedef struct ArrayStruct {
    double num;
    long len; // ideal place to store the array length for future bounds checking!
    double *array;
} ArrayStruct;

int main(int argc, char **argv) {
    ArrayStruct myArray = {0};
    myFunc(&myArray);
    printf("Value is %f array[1] is %f n", myArray.num, myArray.array[1]);
    free(myArray.array);
    return 0;
}

void myFunc(ArrayStruct *s) {
    // Do whatever you like with the struct:
    s->len = 10;
    s->array = (double *)malloc(s->len * sizeof(double));
    for (int i=0; i< s->len; i++)
        s->array[1] = 42;
    s->num = 3.14;
}

这样做意味着你不需要担心返回任何东西或弄乱指针,只需在main中声明结构体,将引用传递给myFunc()或任何你想使用它的地方,然后更改数据,因为你认为合适。

抱歉,如果有任何错误在代码中,只是键入它很快,但它应该说明这一点,无论如何!

相关内容

  • 没有找到相关文章

最新更新