2017-02-23 6 views
0

문자열을 특정 지점까지 해제하려면 어떻게해야합니까?C : 할당 된 문자열의 초기 섹션을 해제하는 방법은 무엇입니까?

char *s = (char *)malloc(sizeof(char) * 21); 
s[20] = '\0'; 
int i = 0; 
while (i < 21) 
{ 
    s[i] = i + 'a'; 
    i++; 
} 

을 그리고 나는 어떤 시점에서 문자열을 차단하고 절반 저장 : 예를 들어 나는 경우

*(s + 10) = '\0'; 
char *m = s + 11; 

s + 10 또는 첫 \0까지 s을 확보 할 수있는 방법이 있나요를?

+2

아니요. realloc으로 끝낼 수 있습니다. 어쨌든 자유 란 무엇을 의미합니까? –

+1

질문과 관련이 없지만 [malloc의 결과를 캐스팅해서는 안됩니다.] (http://stackoverflow.com/q/605845/3425536). – emlai

+2

'while (s [i]! = '\ 0')'에서는 할당 된 메모리가 무엇을 포함하는지 가정합니다. 's [20] = '\ 0';으로 특별히 설정 한 바이트까지는'0 '이 될 수 있습니다. * 정의되지 않은 동작 *이 있습니다. –

답변

4

가 시스템에 의해 할당 된, 당신은 크기를 단축하는 데에 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 
+0

이와 비슷한 것이 있습니까? 'char * c = strdup (s + 10); 무료 (&s); s = strdup (c); 무료 (&c);) ' –

+0

'은'자유'에'&'를 버립니다.내 대답을 편집하여 코드를 포함 시키면 해결됩니다 (그리고 받아 들였기 때문에 :)) –

+1

@CosminSerdean'char * c = strdup (s + 10); 무료 (들); s = c;'는 모두 필요한 것입니다. –

2

s + 10 또는 첫 \0까지 s을 확보 할 수있는 방법이 있습니까?

아니요 표준 라이브러리에는 없습니다.

realloc입니다 있지만 "s + 10 또는 첫 \0까지 무료 s"을 보장 할 수 없습니다. s 이후