2 차원 포인터 - 동적 신청 공간 크기 변경
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;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
OS를 자작 해 보았다!요즘 너무 추워서 진짜로 동사할 것 같은 dangomushi입니다. 진짜로 춥다. 어쨌든, 우선 이 기사는 완전히 스스로 만든 OS가 아닌 것 아직 개선의 여지가 있다 중학생이 만든 것 의 전제를 근거로 한 것이 됩...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.