헤더 파일을 포함해야 합니다:
#포함합니다
또는
#포함합니다
함수 선언(함수 프로토타입):
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를 통해 획득되며 다른 작업은 일관됩니다.
모두 펼치기
첫 번째는 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 함수의 프로토타입을 살펴보실 수 있습니다
void* malloc(int)
malloc의 매개변수는 적용할 메모리 양을 바이트 단위로 나타내는 정수입니다. 반환 값은 해당 메모리에 대한 포인터이며, 이는 널 유형 포인터입니다.
그리고 sizeof는 유형이나 변수가 차지하는 메모리의 바이트 수를 얻을 수 있는 연산자이며 결과는 정수입니다. 따라서 pp=(float *)malloc(sizeof(float)); 실제로 sizeof(float)를 먼저 계산하여 메모리에서 float 유형이 차지하는 바이트 수를 구합니다. 32비트 환경에서는 4바이트여야 합니다. 결과는 4입니다. 그러면 malloc(4)는 4바이트 메모리 공간에 적용되고 이 메모리 영역의 주소를 반환한 다음 강제로 float* 유형으로 변환됩니다.
연결된 목록의 경우 각 연결 목록 요소는 다음 또는 이전 요소의 주소를 저장합니다. 당연히 각 연결 목록 요소는 메모리 공간을 차지합니다. 새 연결 목록 요소를 추가하려면 먼저 이 요소에 주소를 할당해야 합니다. 그렇지 않으면 데이터를 저장할 장소가 없습니다.
위 내용은 C 언어의 동적 메모리 할당을 위한 malloc 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!