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
にスワップして、再び切り替えたときに終了順序が正しくなるようにするつもりです。貴重なご意見ありがとうございました。