您好我遇到了一些我真的不理解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]”也会被修改?
感谢您阅读并向我提供解释,我的逻辑在这里找到了死路。
答案 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语言的基本功能。因为您明确指定seq
和foldedSeq
成员指向相同的内存位,并且通过一个指针的修改将由另一个指示。如果那不是您想要/想要的,那么您需要复制seq
的内存块,然后再将其分配给foldedSeq
以保持两者不同。
答案 3 :(得分:0)
因为它们都指向相同的内存地址,当你修改一个时,你正在修改另一个。
此赋值:M->foldedSeq = M->seq;
只是分配内存位置,而不是进行任何类型的复制。
如果要将它们分开,则必须分配内存并将字符串复制到新内存中。
答案 4 :(得分:0)
尝试:
M->foldedSeq = strdp(M->seq)
如果您也要复制内容。
或者:
M->foldedSeq = malloc(strlen(M->seq) + 1);
只有一个相同大小的新内存空间。