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

时间:2013-03-23 20:19:53

标签: arrays malloc

抱歉,我今天大部分时间都在努力解决可能是一个简单的指针问题,想知道是否有人可以提供帮助。

我想要一个向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 memory\n");
  }

  *ptr = (double *) memory;


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


  return 3.14;
}

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

以下行是您将i添加到变量a:

的地址
**(ptr+i) = 42;

要将i添加到malloced地址,您需要先取消引用ptr:

*(*ptr+i) = 42;

答案 1 :(得分:0)

除了@ 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,但必须存储值的(一个或有时几个)地方除外,以便调用者接收它。

答案 2 :(得分:0)

数组和数字之间有什么关系?为了简单起见,将它们放在一个结构中并不是更好,这将有助于在这里清理它们。

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中声明struct,传递对myFunc()的引用或者你想要使用它的任何地方,然后改变你认为合适的数据。

很抱歉,如果该代码有任何错误,只需快速输入,但它应该说明这一点!