1

m次の簡単な例では、 insideの最初の要素にアクセスしようとするとセグメンテーション違反が発生しますmain

なぜこれが起こるのですか?

どうすれば修正できますが、コードの全体的な構造を同じに保つことができますか?

ありがとう。

#include <stdio.h>
#include <stdlib.h>

double *array(int cols) {
  return malloc(cols*sizeof(double));
}

void create_and_modify_array(double *m) {
  m = array(10);
  m[0] = 123;
}

void main() {
  double *m;
  create_and_modify_array(m);
  printf("%f\n", m[0]);
}
4

3 に答える 3

6

ここでの問題は、Cが常に値で渡されることです。値渡しとは、関数の引数が呼び出された変数のコピーであることを意味します。これは、これを行うときに次のことを意味します。

m = array(10);

内部では、関数のポイントcreate_and_modify_array(double *m)のローカルコピーの場所のみを変更しています。mmainメソッドからのmポインターは影響を受けません(初期化されないままなので、クラッシュします)。

main()これを修正するには、ポインタをのポインタに渡すことができmます。

void create_and_modify_array(double **m) {
  *m = array(10); // change the pointer that `m` points to
  (*m)[0] = 123;  // assign something to the first element of what `m` points to
}

そして、のアドレスを次main()のように渡しますm

void main() {
  double *m; // make a pointer to a double
  create_and_modify_array(&m); // pass a pointer to the pointer to the double
                               // or, in alternative wording: 
                               // pass the address of the pointer to the double
于 2013-02-14T00:28:44.917 に答える
2

で作成されたポインタcreate_and_modify_arrayは、で宣言および使用されたものとは異なるアドレスであるためmain()です。代わりにこれを行うことができます

double *create_and_modify_array(double *m) {
  m = array(10);
  m[0] = 123;
  return m;
}

void main() {
  double *m = create_and_modify_array(m);
  printf("%f\n", m[0]);
  free (m);
}
于 2013-02-14T00:28:47.433 に答える
1

create_and_modify_array内部の mはローカル変数であるため、セグメンテーション違反が発生するため、内部の mmainはまだ初期化されていません。

より明確にするために、コードフローは次のとおりです。

の先頭はmain m、割り当てられていないランダムなメモリ アドレスです。create_and_modify_array次に、そのメモリアドレスで呼び出します。内部create_and_modify_arrayには、呼び出された新しい変数mが作成され、渡されたランダムで割り当てられていないメモリアドレスがあります。次に、呼び出して、内部arrayの変数が割り当てられたメモリに割り当てられます。mcreate_and_modify_array

問題は、 の値がin にm戻されないことです。mmain

mこれを行うには、mainへのポインターを に渡す必要がありますcreate_and_modify_array

void create_and_modify_array (double **m) {
    double *tmp = array(10);
    tmp[0] = 123;
    *m = tmp; // This passes the value of tmp back to the main function.
              // As m in this function is actually the address of m in main
              // this line means put tmp into the thing that is at this address
}

void main () {
    double *m;
    create_and_modify_array (&m); // This passes the address of the variable m
                                  // into create_and_modify_array
    printf ("%f\n", m[0]);
}
于 2013-02-14T00:35:29.113 に答える