0

您好,我遇到了一些我真的不明白 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->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;

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

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

您所看到的是简单的指针别名,这是 C 语言的一个基本特性。因为您显式地将seqfoldedSeq成员都指定为指向同一位内存,并且通过一个指针进行的修改将被另一个见证。如果这不是您想要/想要的,您需要seq在分配内存块之前复制它foldedSeq以保持两者不同。

于 2013-05-15T14:28:54.220 回答
0

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

于 2013-05-15T14:29:54.720 回答
0

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

或者:

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

于 2013-05-15T14:32:57.693 回答