> 컴퓨터 튜토리얼 > 컴퓨터 지식 > C 언어의 동적 메모리 할당을 위한 malloc 함수

C 언어의 동적 메모리 할당을 위한 malloc 함수

WBOY
풀어 주다: 2024-01-17 09:09:06
앞으로
904명이 탐색했습니다.

C 언어의 동적 메모리 할당을 위한 malloc 함수

C 언어의 malloc 함수

헤더 파일을 포함해야 합니다:

#포함합니다

또는

#포함합니다

함수 선언(함수 프로토타입):

void *malloc(int 크기);

malloc 함수는 지정된 크기의 메모리 공간을 할당하기 위해 시스템에 적용하는 데 사용되며 반환 유형은 void*입니다. C 및 C++에서 void* 유형의 포인터는 다른 유형의 포인터로 캐스팅될 수 있습니다.

함수 선언에서 볼 수 있듯이, malloc과 new 사이에는 최소한 두 가지 차이점이 있습니다. new는 지정된 유형의 포인터를 반환하고 필요한 크기를 자동으로 계산할 수 있습니다. 예:

int *p;

p = new int; //반환 유형은 int* 유형(정수 포인터)이고 할당 크기는 sizeof(int);

또는:

int* parr;

parr = new int [100]; //반환 유형은 int* 유형(정수 포인터)이고 할당 크기는 sizeof(int) * 100;

malloc을 사용하면 필요한 바이트 수를 계산하고 반환 후 실제 유형의 포인터로 강제 변환해야 합니다.

int* p;

p = (int *) malloc (sizeof(int));

먼저, malloc 함수는 void * 유형을 반환합니다. p = malloc (sizeof(int));라고 쓰면 프로그램을 컴파일할 수 없으며 "void*는 int *에 할당할 수 없습니다."라는 오류 메시지가 표시됩니다. 유형 변수." 따라서 캐스팅하려면 (int *)를 전달해야 합니다.

둘째, 함수의 실제 매개변수는 sizeof(int)이며, 이는 정수 데이터의 필요한 크기를 지정하는 데 사용됩니다. 작성하는 경우:

int* p = (int *) malloc (1);

코드를 컴파일할 수도 있지만 실제로는 1바이트의 메모리 공간만 할당됩니다. 여기에 정수를 저장하면 3바이트는 노숙자가 되어 직접 "이웃집에 살게 됩니다"! 결과적으로 후속 메모리의 모든 원본 데이터 내용이 지워집니다.

malloc은 new []의 효과를 달성하고 연속 메모리를 적용할 수도 있습니다. 이 방법은 필요한 메모리 크기를 지정하는 것 이상입니다.

예를 들어 100개의 int 유형 공간을 할당하려는 경우:

int* p = (int *) malloc ( sizeof(int) * 100 ); //100개의 정수를 저장할 수 있는 메모리 공간을 할당합니다.

직접적으로 볼 수 없는 또 다른 차이점은 malloc은 메모리만 할당하고 획득한 메모리를 초기화할 수 없기 때문에 획득한 새 메모리의 값은 무작위라는 점입니다.

다른 할당 및 최종 해제 방법을 제외하면 포인터는 malloc 또는 new를 통해 획득되며 다른 작업은 일관됩니다.

C 언어의 malloc 함수 문제. 다음 함수에서 malloc을 두 번 사용하여 p에게 총 6개의 메모리를 제공했습니다.

모두 펼치기

첫 번째는 3개의 정수를 할당했지만 두 번째로 할당한 경우에도 이 포인터를 새 메모리의 처음 3개에 할당하지 않았습니다. 직접적으로 범위를 벗어나서 3개의 int 단위를 썼는데, 프로그램이 즉시 충돌하지 않은 것은 우연입니다

int *p, *p1,i;

p = (int *)malloc(3*sizeof(int));

for(i=0;i

printf("n int put:");

scanf("%d",p+i);

}

p1 = (int *)malloc(3*sizeof(int));

for(i=0; i

printf("n int put:");

scanf("%d",p1+i);

}

for(i=0;i

for(i=0;i

매우 간단한 malloc 함수 문제

malloc 함수의 프로토타입을 살펴보실 수 있습니다

void* malloc(int)

malloc의 매개변수는 적용할 메모리 양을 바이트 단위로 나타내는 정수입니다. 반환 값은 해당 메모리에 대한 포인터이며, 이는 널 유형 포인터입니다.

그리고 sizeof는 유형이나 변수가 차지하는 메모리의 바이트 수를 얻을 수 있는 연산자이며 결과는 정수입니다. 따라서 pp=(float *)malloc(sizeof(float)); 실제로 sizeof(float)를 먼저 계산하여 메모리에서 float 유형이 차지하는 바이트 수를 구합니다. 32비트 환경에서는 4바이트여야 합니다. 결과는 4입니다. 그러면 malloc(4)는 4바이트 메모리 공간에 적용되고 이 메모리 영역의 주소를 반환한 다음 강제로 float* 유형으로 변환됩니다.

연결된 목록의 경우 각 연결 목록 요소는 다음 또는 이전 요소의 주소를 저장합니다. 당연히 각 연결 목록 요소는 메모리 공간을 차지합니다. 새 연결 목록 요소를 추가하려면 먼저 이 요소에 주소를 할당해야 합니다. 그렇지 않으면 데이터를 저장할 장소가 없습니다.

위 내용은 C 언어의 동적 메모리 할당을 위한 malloc 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:docexcel.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿