2013-05-15 35 views
0

你好,我正在經歷的事情,我真的不明白C中的結構的原理。 我的結構之一包含2個字符串(名爲'seq'和'foldedSeq')。這兩個字符串(應該)具有相同的尺寸。 但是,當我嘗試修改一個,第二個自動在字符串的相同指定位置進行相同的修改。Unfathomable C結構

這裏是代碼的有趣塊:

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->序列[I]」 進行修改,以及??

謝謝你閱讀並提供給我解釋,我的邏輯在這裏發現了一個死衚衕。

回答

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

是等於說

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

它們都指向同一個內存位置。所以修改一個就是修改兩個。

也許你想要做的是malloc一塊與另一塊長度相同的內存塊。

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

你是不是在'malloc'之後缺少'strcpy'?就目前而言,代碼提供了適當大小的未初始化內存塊。 – simonc

+0

@simonc評論只是說它想要的長度不一樣相同的內容。他立即用'-'填充它。 – FDinoff

+0

什麼是q?您是否意味着+ 1的無效終止? – Lundin

0

這條線:

M->foldedSeq = M->seq; 

foldedSeq指針作爲seq設定爲相同的值。它不會創建新的空間並將seq的內容複製到foldedSeq,這可能是混淆的地方。所以當你修改其中一個時,另一個也會被修改。一個可能的解決方案是使用strdup

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

什麼你看到的是簡單的指針別名,C語言的基本特徵。因爲您明確指定seqfoldedSeq成員指向相同位的內存,並且通過一個指針的修改將由另一個指針來見證。如果這不是你想要/想要的,你需要複製seq的內存塊,然後將其分配給foldedSeq以保持兩者不同。

0

因爲他們都指向相同的內存地址,當你修改一個你正在修改另一個。 此作業:M->foldedSeq = M->seq;只是分配內存位置,不做任何形式的複製。 如果你想保持它們分開,你將不得不分配內存並將字符串複製到新的內存中。

0

請嘗試: M->foldedSeq = strdp(M->seq)如果您要複製內容。

或者:

M->foldedSeq = malloc(strlen(M->seq) + 1);只是有同樣大小的一個新的內存空間。