2 차원 포인터 - 동적 신청 공간 크기 변경

만약 내 가 지금 10 바이트 크기 의 공간 을 동적 으로 신청 했다 면.
char* p = ( char* ) malloc ( sizeof ( char ) * 10 );

저 는 10 개의 바이트 크기 의 공간 을 신 청 했 습 니 다. 그러나 저 는 이렇게 많은 공간 을 사용 하지 못 했 습 니 다. 공간 을 절약 하기 위해 저 는 불필요 한 공간 을 방출 해 야 합 니 다. 즉, 동태 적 으로 신청 하 는 공간 크기 를 바 꿔 야 합 니 다.만약 에 내 가 지금 그 중의 5 개의 바이트 크기 의 공간 만 사용 해 야 한다 고 가정 하면 그 중에서 5 개의 바이트 가 필요 하 다 는 것 을 의미한다.원래 10 개의 바이트 크기 의 공간 을 5 개의 바이트 크기 의 공간 으로 바 꾼 것 이다.그럼 이제 동적 신청 공간 크기 를 바 꾸 는 함 수 를 확인 합 니 다.우선, 우 리 는 공간 크기 를 바 꿔 야 하기 때문에 필연적으로 우리 가 최초 로 신청 한 공간 크기 와 우리 가 바 꾸 고 싶 은 새로운 공간 크기 를 지정 해 야 한다.이것 은 동적 신청 공간 이기 때문에 우 리 는 함 수 를 실현 할 때 이 동적 신청 공간 을 가리 키 는 지침 이 필요 합 니 다.그러면 이 함수 성명 은 다음 과 같다.
void reset ( char** p, int size, int new_size );

지금, 우 리 는 이미 함수 의 성명 을 가지 고 있다. 그러면 우 리 는 지금 그것 을 실현 할 것 이다.우 리 는 이 원래 의 공간의 크기 를 바 꾸 려 고 하기 때문에 분명 하 다. 우 리 는 새로운 지침 으로 새로운 공간 을 동적 으로 신청 해 야 한다.코드 는 다음 과 같 습 니 다:
char* pt = NULL;
pt = ( char* ) malloc ( sizeof ( char ) * new_size );

이론 적 으로 볼 때 우리 함수 중의 2 차원 포인터 p 는 이미 주 함수 중의 1 차원 지침 을 가리 키 고 있다. 즉, reset 함수 에서 우 리 는 직접
*p = pt;

안 타 깝 게 도 이렇게 하 는 것 은 틀 렸 다.분명히 우 리 는 원래 공간의 값 을 새로운 신청 공간 에 넣 지 않 았 다. 공간 이 바 뀌 어야 하지만 원래 공간의 값 은 새로운 공간 에 넣 지 않 았 다.그래서 우 리 는 지금 함수 에서 데이터 복사 작업 을 완성 해 야 합 니 다.그러면 지금 우 리 는 새로 개 설 된 공간 을 가리 키 는 새로운 지침 이 필요 합 니 다. 순환 해서 값 을 하나씩 넣 는 역할 을 합 니 다.
char* tmp = pt;

그 밖 에 복사 해 야 할 데이터 가 몇 개 있 는 지 알 아야 한다.따라서 데이터 개 수 를 기록 하기 위해 서 는 변수 가 필요 하 다.전체 코드 는 다음 과 같 습 니 다:
void reset ( char** p, int size, int new_size ){

    char* pt  =  NULL;
    char* tmp = NULL;
    int len = 0;
    char* pp = *p;
    int i = 0;

    if ( p != NULL && new_size > 0 ){

        pt = ( char* ) malloc ( sizeof ( char ) * new_size );
        tmp = pt;

        len = ( size < new_size ) ? size: new_size;

        for ( i = 0; i < len; ++i )
            *tmp++ = *pp++;

            free ( *p );

            *p = pt;

    }

}

좋은 웹페이지 즐겨찾기