0

こんにちは、私は C の構造の原理を本当に理解していないことを経験しています。私の構造の 1 つに 2 つの文字列 ('seq' と 'foldedSeq' という名前) が含まれています。これらの文字列は両方とも同じ寸法である必要があります。ただし、1 つを変更しようとすると、2 つ目は文字列の指定された同じ場所で同じ変更を自動的に行います。

興味深いコードのチャンクは次のとおりです。

typedef struct MD {

 int nb_line;
 int nb_colomn;
 EM ** matrix; 
 char * seq;  // Initial sequence.
 char * foldedSeq;
} MD;


void set_sequences(MD * M, char * seq) {

 M->seq = seq;
 M->foldedSeq = M->seq; //Purpose: give to foldedSeq the seq dimensions (perhaps it is useless).


 printf("seq= %s\tstrlen= %d\nM->seq= %s\nM->foldedSeq= %s\n", seq, strlen(seq), M->seq, M->foldedSeq);
  // Up to this point 'seq' = 'foldedSeq'


 int i;
 for( i = 0; i < strlen(seq); i++) {
  M->foldedSeq[i] = '-'; // Original purpose: make 'foldedSeq' string filled with hyphens only.
 } 

 printf("seq= %s\tstrlen= %d\nM->seq= %s\nM->foldedSeq= %s\n", seq, strlen(seq), M->seq, M->foldedSeq);
// Here is the problem: the string 'seq' REALLY IS modified alongside with 'foldedSeq'... WHY? :(
}

"M->foldedSeq[i]" を変更する必要があると書いたのに、なぜ "M->seq[i]" も変更する必要があるのでしょうか??

説明を読んでくれてありがとう、私の論理はここで行き止まりを見つけました。

4

5 に答える 5

2
 M->seq = seq;
 M->foldedSeq = M->seq;

と言っているのと同じです

 M->seq = seq;
 M->foldedSeq = seq;

どちらもメモリ内の同じ場所を指しています。したがって、一方を変更すると両方が変更されます。

おそらく、代わりにやりたいことは、他のブロックと同じ長さのメモリブロックをmallocすることです。

 M->foldedSeq = calloc(strlen(seq) + 1, sizeof(char));
于 2013-05-15T14:28:53.877 に答える
0

どちらも同じメモリアドレスを指しているため、一方を変更するともう一方も変更されます。この割り当て:M->foldedSeq = M->seq;メモリの場所を割り当てるだけで、コピーは一切行いません。それらを別々に保持したい場合は、メモリを割り当てて、文字列を新しいメモリにコピーする必要があります。

于 2013-05-15T14:29:54.720 に答える
0

この行:

 M->foldedSeq = M->seq;

foldedSeqポインタを と同じ値に設定していますseq。新しいスペースを作成したり、混乱の原因となるコンテンツをコピーしたりすることはありませんseqfoldedSeqしたがって、どちらかを変更すると、もう一方も変更されます。考えられる解決策の 1 つは、次を使用することstrdupです。

M->foldedSeq = strdup( M->seq ) ;
于 2013-05-15T14:28:54.233 に答える
0

あなたが目にしているのは、C 言語の基本的な機能である単純なポインターのエイリアシングです。seqメンバーとメンバーの両方を明示的に割り当ててfoldedSeq、メモリの同じビットを指すようにすると、一方のポインターによる変更がもう一方のポインターによって確認されるためです。それが意図した/望んでいないものである場合は、メモリブロックをseq割り当てる前にコピーfoldedSeqして、2 つを区別する必要があります。

于 2013-05-15T14:28:54.220 に答える