不可思议的C结构

时间:2013-05-15 14:25:31

标签: c structure

您好我遇到了一些我真的不理解C中结构的原理。 我的一个结构包含2个字符串(名为'seq'和'foldedSeq')。这些字符串(应该)都具有相同的尺寸。 但是,当我尝试修改一个时,第二个会自动在字符串的同一指定位置进行相同的修改。

这是有趣的代码块:

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-&gt; foldedSeq [i]”应该被修改,为什么“M-&gt; seq [i]”也会被修改?

感谢您阅读并向我提供解释,我的逻辑在这里找到了死路。

5 个答案:

答案 0 :(得分:2)

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

与说

相同
 M->seq = seq;
 M->foldedSeq = seq;

他们都指向内存中的相同位置。所以修改一个就是修改它们。

你想要做的事情可能是malloc是一块与另一块长度相同的内存块。

 M->foldedSeq = calloc(strlen(seq) + 1, sizeof(char));

答案 1 :(得分:0)

这一行:

 M->foldedSeq = M->seq;

foldedSeq指针设置为与seq相同的值。它不会创建新空间并将seq的内容复制到foldedSeq,这可能是混淆的地方。因此,当您修改其中任何一个时,另一个也将被修改。一种可能的解决方案是使用strdup

M->foldedSeq = strdup( M->seq ) ;

答案 2 :(得分:0)

您目击的是简单的指针别名,这是C语言的基本功能。因为您明确指定seqfoldedSeq成员指向相同的内存位,并且通过一个指针的修改将由另一个指示。如果那不是您想要/想要的,那么您需要复制seq的内存块,然后再将其分配给foldedSeq以保持两者不同。

答案 3 :(得分:0)

因为它们都指向相同的内存地址,当你修改一个时,你正在修改另一个。 此赋值:M->foldedSeq = M->seq;只是分配内存位置,而不是进行任何类型的复制。 如果要将它们分开,则必须分配内存并将字符串复制到新内存中。

答案 4 :(得分:0)

尝试: M->foldedSeq = strdp(M->seq)如果您也要复制内容。

或者:

M->foldedSeq = malloc(strlen(M->seq) + 1);只有一个相同大小的新内存空间。