2013-11-01 2 views
2

이전에 그러한 문을 잘 사용했지만 왜 이런 일이 발생하는지 매우 혼란 스럽습니다. 한 문자열을 다른 문자열로 복사하는 중입니다. strtok이 호출되기 전에도 원래 문자열이 손상됩니다. 이 코드는 관련 코드 스 니펫이며 이후에 strtok을 사용하고 있습니다. 하지만 그 전에 나는 reference이 손상된 것을보고 있습니다.C : 문자열이 malloc과 strcpy 사이에서 손상되었습니다.

int j, sizeref; 
char *str1, *token; 

printf("%s :", reference); 
sizeref = strlen(reference); 
printf("%d\n", sizeref); 
track = malloc(sizeref); 
printf("%s :", reference); 
strcpy(track, reference); 
printf("%d\n", strlen(track)); 

다음은 출력입니다. 첫 번째 줄은 전체 reference과 234로 올바른 크기를 인쇄합니다. 그 후 나는 106 문자 만 복사되고 원본 문자열 reference 또한 106 자로 잘 렸습니다. trackchar *

+918956549122,9527529747,09847778399,08596774833,9867859469,+919999866778,6985888696,5968939898,6959869856,9898495895,6986596865,09847765399,88596774833,9967859469,+917899866778,6985889696,9527567747,09848778399,08596756733,9867999469 :234 
+918956549122,9527529747,09847778399,08596774833,9867859469,+919999866778,6985888696,5968939898,69598698 :106 

더 많은 정보로 선언 : 참조는 50 바이트의 덩어리로 점진적으로 구축지고 있습니다. 일단 완전히 빌드되면 위에서 언급 한 대로만 사용됩니다. char * reference은 전역이며 main 내부에 빌드됩니다. 언급 한 위의 코드 당신은 아마 배열이 포인터와는 sizeof 반환 포인터의 크기에 붕괴 곳 함수에 sizeof 연산자를 사용하여 배열의 크기를 얻으려고 노력하는 별도의 기능

realloc(reference,strlen(reference) + CHUNK); 
+2

'track = malloc (sizeref + 1)'... 당신은 NUL 터미네이터를위한 공간을 할당하지 않습니다. 그 외에는 프로그램에 또 다른 UB가 있습니다. 'strlen()'은'size_t'와 ** int **를 반환하므로'% d '가 아닌'% zu'를 사용하여 출력해야합니다. –

+1

@ H2CO3 때로는 너무 많은 타이핑을 저장합니다. 언젠가는 그 보너스를 상환해야합니다. P – WhozCraig

+0

@WhozCraig : D 정당합니다. –

답변

0

안에 있습니다.

1

C 문자열은 null로 끝납니다. 코드를 track=malloc(sizeref + 1);으로 변경하십시오. 그렇지 않으면 strcpy는 유효한 메모리 외부에 널 종료를 쓰려고 시도합니다.

3

에 매뉴얼에 따르면 나 strlen() : 위에서 언급 한 바와 같이

DESCRIPTION 
     The strlen() function calculates the length of the string s, 
     excluding the terminating null byte ('\0'). 

그래서, 당신은 올바른 널 (null) 종료에 대한 크기 나 strlen() + 1의 버퍼를 할당한다.

+0

그래, 그게 사실이지만, 어떻게이 문제를 해결할 것입니다. strlen() + 1, 여전히 동일한 결과를 시도했다. +1을 사용하지 않는다면 적어도 234 바이트를 할당해야하지만, 106에서 멈추고 있습니다. 이상합니다. –

+0

@DiwakarSharma 방금 strlen (.) + 1을 사용하여 질문의 코드 부분을 확인했는데 제대로 작동합니다. % : 입력 된 모든 숫자 % : 236 \ n % 모든 입력 숫자 % : 235.이게 맞습니다 (두 번째 strlen은 236-1을줍니다). 추측, 코드의 다른 부분에서 오류가있는 경우. 따라서이 문제를 해결하기 위해 가능한 한 작고 오류가있는 테스트 코드 (독립 실행 형 main() {}로 묶음)를 게시하십시오. 그렇다면 사람들이 당신을 도울 것입니다. – Michael

+0

글쎄, 나는 나의 접근법과 논리를 내가 느낀 더 나은 것으로 바꾸었고 거기에 문제에 대한 다른 질문을 게시했다. http://stackoverflow.com/questions/19761453/c-array-of-char-pointers-not-working-as-expected-dynamically –