0

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

我想要一个将数字和数组返回给 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()。我希望它动态分配数组,以便程序可以对任何大小的文件进行操作。]

谢谢你的帮助!

4

3 回答 3

2

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

**(ptr+i) = 42;

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

*(*ptr+i) = 42;
于 2013-03-23T20:34:40.127 回答
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)or (*ptr)[index],而是创建一个局部变量来保存您还将存储到的值——这里*ptr我称之为局部变量dp——然后你只需dp在本地使用,除了(一个,有时是几个) 必须存储该值的位置,以便您的调用者接收它。

于 2013-03-23T20:45:53.980 回答
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 中声明该结构,将引用传递给myFunc()您想要使用它的任何位置,然后根据需要更改数据。

抱歉,如果该代码中有任何错误,请快速输入,但无论如何它都应该说明这一点!

于 2013-03-23T21:09:23.250 回答