2013-05-15 2 views
0

안녕하세요. 실제로 C 구조체의 원리를 이해하지 못합니다. 내 구조 중 하나에 2 개의 문자열 ('seq'및 'foldedSeq')이 있습니다. 이 문자열은 모두 동일한 차원을 가져야합니다. 그러나 하나를 수정하려고하면 두 번째 문자열은 문자열의 동일한 지정된 위치에서 동일한 수정 사항을 자동으로 가져옵니다. 여기 치명적이지 않은 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 [내가]"수정해야, 왜 "M-> 서열 [내가]"뿐만 아니라 수정 될 것입니다 ??

내 설명을 읽고 제공 해주셔서 감사합니다. 제 논리는 여기서 막 다른 길을 찾았습니다.

답변

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

@imonc 의견은 단지 같은 길이가 아닌 동일한 길이를 원한다고 말합니다. 그리고 즉시'-'로 채 웁니다. – FDinoff

+0

'q'는 무엇입니까?널 종료에 +1이 있었습니까? – Lundin

0

이 라인 :

M->foldedSeq = M->seq; 

seq가 동일한 값 foldedSeq 포인터를 설정한다. 새로운 공간을 생성하지 않고 seq의 내용을 foldedSeq으로 복사하는 것은 혼동이있는 곳일 수 있습니다. 그래서 둘 중 하나를 수정할 때 다른 하나도 수정 될 것입니다. 한 가지 가능한 솔루션은 strdup을 사용하는 것입니다

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

당신이 목격하는 것은 간단한 포인터 앨리어싱, C 언어의 기본 기능입니다. seqfoldedSeq 멤버를 모두 동일한 메모리 비트를 가리 키도록 명시 적으로 지정하고 하나의 포인터를 통한 수정은 다른 하나의 메모리에서 확인됩니다. 원하는 의도가 아니었다면 foldedSeq에 할당하기 전에 seq의 메모리 블록을 복사해야합니다.

0

둘 다 동일한 메모리 주소를 가리키고 하나를 수정할 때 다른 주소를 수정하기 때문에. 이 할당 : M->foldedSeq = M->seq;은 메모리 위치를 할당하는 것으로, 어떤 종류의 복사본도 수행하지 않습니다. 분리하여 보관하려면 메모리를 할당하고 문자열을 새 메모리에 복사해야합니다.

0

콘텐츠를 복사하려면 M->foldedSeq = strdp(M->seq) 중 하나를 사용해주세요.

또는 :

M->foldedSeq = malloc(strlen(M->seq) + 1);은 같은 크기의 새 메모리 공간이 있습니다.

관련 문제