이전에 그러한 문을 잘 사용했지만 왜 이런 일이 발생하는지 매우 혼란 스럽습니다. 한 문자열을 다른 문자열로 복사하는 중입니다. 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 자로 잘 렸습니다. track
는 char *
+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);
'track = malloc (sizeref + 1)'... 당신은 NUL 터미네이터를위한 공간을 할당하지 않습니다. 그 외에는 프로그램에 또 다른 UB가 있습니다. 'strlen()'은'size_t'와 ** int **를 반환하므로'% d '가 아닌'% zu'를 사용하여 출력해야합니다. –
@ H2CO3 때로는 너무 많은 타이핑을 저장합니다. 언젠가는 그 보너스를 상환해야합니다. P – WhozCraig
@WhozCraig : D 정당합니다. –