가 시스템에 의해 할당 된, 당신은 크기를 단축하는 데에 realloc
을 수행 할 수 있습니다
s = realloc(s, 11);
을하지만, 나머지를 확보하지 않고 할당 된 영역의 시작을 확보 할 수없는 당신은 할 수 없습니다 . 나중에 memmove
& realloc
을 사용하여 데이터를 이동하고 크기를 줄입니다.
free
할당되지 않은 포인터 또는 할당 된 포인터와 오프셋을 사용하면 정의되지 않은 동작이 발생합니다.
당신이 할 수있는 (당신이 자신을 제안하지만, 문제는 : 고정) :
char *c = strdup(s + 10);
free(s);
s = c;
그래서 지금 s
포인트를 문자열의 끝.
대안 strdup
없이하지만 (널 종료 문자 망각의 위험) 표준 기능을 사용하여 :
char *c = malloc(strlen(s) - 10 + 1);
strcpy(c,s + 10);
free(s);
s = c;
내가 처음에 대한 암시 된 memmove
솔루션 (무료지만 오프셋/할당 방지/크기가 계산하기가 더 까다 롭습니다.)
int offset = 10;
int size = strlen(s) - offset;
memmove(s,s+offset,size);
s[size]='\0'; // null-terminate
s = realloc(s,size+1); // adjust size after null-termination
아니요. realloc으로 끝낼 수 있습니다. 어쨌든 자유 란 무엇을 의미합니까? –
질문과 관련이 없지만 [malloc의 결과를 캐스팅해서는 안됩니다.] (http://stackoverflow.com/q/605845/3425536). – emlai
'while (s [i]! = '\ 0')'에서는 할당 된 메모리가 무엇을 포함하는지 가정합니다. 's [20] = '\ 0';으로 특별히 설정 한 바이트까지는'0 '이 될 수 있습니다. * 정의되지 않은 동작 *이 있습니다. –