0

2つのポインターがあり、それぞれが異なる配列を指しています。ポインタの1つは、次のように構造体の内部にあります。

typedef struct
{
    int     N;    /* Number of Elements in array */
    double *c;    /* Pointer to an array         */
    /* Other members....  */
} CS;

構造体は次のように初期化されました。

CS->N = n; /* n is an integer of an initially unknown size */
CS->c = (double *)malloc(n * sizeof(double));

構造体のポインタ、、にはCS->C、私がもう気にしないデータが含まれています。

私の他のポインターは次のように定義されました:

double *alpha;
alpha = (double *)malloc(CS->N * sizeof(double));

CS->Cの内容をに置き換える必要がありalphaます。私は次のような素朴なことができることを知っています:

for (i=0;i<CS->N;i++) /* i is an integer */
    CS->c[i] = alpha[i];

次のように、memcpyを使用することもできます。

memcpy(CS->c,alpha,CS->N * sizeof(double));

私の理解では、これらの方法は両方とも、にalphaあるメモリからによって占有されているメモリにコンテンツをコピーしCS->Cます。これは非常にコストのかかる操作であるため、の割り当てを単純に変更する方が理にかなっていCS->Cますalpha

これどうやってするの?

のようにポインタを再割り当てしようとしましたCS->C = &alphaが、「互換性のないポインタ型からの割り当て」という警告が表示されます。

注:これは、完全に準拠したANSI C89を使用しています。つまり、コンパイラオプションは次のとおりです。-Wall -pedantic -ansi

編集1
次の手順を実行して、 解放CS->cして割り当てますalpha

free(CS->c);
CS->c = alpha;

動作しません。これにより、のすべてのエントリがCS->cに等しくなり0.0、プログラムセグメントに障害が発生します。

編集2
最初の編集で提案された方法が機能しなかった理由を理解したと思います。alphaは一時的なポインタであり、関数内で作成および初期化されるため、その関数が終了すると、占有されているメモリalphaは「解放」されます。そのメモリを指しているのでCS->c、それも解放されます。この発見があったら、コードを作り直して、alpha最初CS-cにスワップして、再び切り替えたときに終了順序が正しくなるようにするつもりです。貴重なご意見ありがとうございました。

4

2 に答える 2

1

ポインタをコピーするだけです

CS->C = alpha;

Alphaはdoubleへのポインターであり、CS-> Cもタイプが一致し、ポインターを変更するだけです。

/!\古いCS->C..を解放することを忘れないでください。

于 2013-02-03T18:09:47.597 に答える
0

古いポインタを解放し、新しいポインタを直接評価します。(新しいポインタのアドレスではありません)

構造体のポインタ、、にはCS->c、私がもう気にしないデータが含まれています。

私の他のポインターは次のように定義されました:

double *alpha;
alpha = malloc(CS->N * sizeof(double));

..。

free (CS->c);
CS->c = alpha ; alpha=NULL;
于 2013-02-03T18:07:28.457 に答える