0

申し訳ありませんが、私は今日のほとんどを、おそらく単純なポインタの問題を解決するために費やしてきました。誰かが助けてくれるかどうか疑問に思っていました。

main()に数値と配列を返す関数が必要なので、これらの少なくとも1つにポインターを使用する必要があります。配列は、関数内で動的に割り当てる必要があります。

以下に、最善の試みを簡略化した形で示してみました。「セグメンテーション違反」が発生します。

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

変数aのアドレスにiを追加する次の行:

**(ptr+i) = 42;

マロックされたアドレスにiを追加するには、最初にptrを逆参照する必要があります。

*(*ptr+i) = 42;
于 2013-03-23T20:34:40.127 に答える
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 に答える
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(ここではそのローカル変数と呼びます)、(1 つ、場合によってはいくつかの) を除いてローカルでdp使用します。 dp) は、呼び出し元が値を受け取るために値を格納する必要がある場所です。

于 2013-03-23T20:45:53.980 に答える