찾다

malloc 함수 활용

Jun 14, 2019 am 09:55 AM
malloc기능

malloc 함수 활용

malloc의 전체 이름은 메모리 할당이며, 이를 중국어로 동적 메모리 할당이라고 합니다. 지정된 크기의 연속적인 메모리 블록 영역을 적용하고 할당된 메모리 영역 주소를 void* 형식으로 반환하는 데 사용됩니다. 메모리의 구체적인 위치를 알 수 없으므로 실제 메모리 공간을 바인딩하려면 메모리의 동적 할당을 사용해야 합니다.

void* 유형은 유형이 지정되지 않은 포인터를 나타냅니다. C 및 C++에서는 유형 변환을 통해 void* 유형을 다른 유형의 포인터로 강제 변환할 수 있다고 규정합니다.

일반적으로 무료 기능과 페어링되어야 합니다.

함수 정의

Prototype

extern void *malloc(unsigned int num_bytes);

헤더 파일

#include <stdlib.h>

함수 선언

void *malloc(size_t size);

Remarks: void*는 결정되지 않은 유형의 포인터를 나타내며, void *는 모든 유형의 데이터를 가리킬 수 있습니다. 더 구체적으로 말하면 적용을 의미합니다. 메모리용 사용자가 이 공간을 사용하여 저장하는 데이터 유형(예: char, int 또는 기타 데이터 유형)은 알려져 있지 않습니다.

반환값

할당에 성공하면 할당된 메모리에 대한 포인터가 반환되고(이 저장 영역의 초기 값은 불확실함), 그렇지 않으면 널 포인터 NULL이 반환됩니다. 메모리가 더 이상 사용되지 않으면 free() 함수를 사용하여 메모리 블록을 해제해야 합니다. 함수에서 반환된 포인터는 모든 데이터 개체와 함께 사용할 수 있도록 올바르게 정렬되어야 합니다.

Explanation

이 함수의 프로토타입과 관련하여, 이전에 malloc은 char 포인터를 반환했습니다. 새로운 ANSIC 표준에서는 이 함수가 void 포인터를 반환하도록 규정하고 있으므로 필요한 경우 유형 변환이 필요합니다. num_bytes(또는 size) 바이트 길이의 메모리 블록을 할당하도록 시스템에 적용할 수 있습니다.

일반적으로 무료 기능과 결합되어야 합니다. free 함수는 동적으로 할당된 주소를 해제하여 동적으로 할당된 메모리가 더 이상 사용되지 않음을 나타내며 이전에 동적으로 적용된 메모리를 시스템에 반환합니다.

관련 기능

calloc, realloc, free, _alloca.

의 차이점 본질적으로 malloc(Linux에서 구체적인 구현은 man malloc을 참조하세요. glibc는 brk()&mmap()을 통해 구현됩니다)은 libc에 구현되어 있지 않으면 libc에 구현되는 함수입니다. 소스 코드 stdlib.h가 직접 또는 간접적으로 포함되면 gcc는 오류를 보고합니다: 'malloc'이 이 범위에서 선언되지 않았습니다. 대상 파일이 생성된 경우(동적으로 연결된 malloc 가정), 실행 중인 플랫폼에 libc가 없거나(Linux 플랫폼의 경우 빈 디렉터리에 LD_LIBRARY_PATH를 수동으로 지정) libc에 malloc 함수가 없으면 다음과 같습니다. 런타임에 실행됨(런타임) 문제가 발생했습니다. New는 C++의 키워드이며 함수 자체가 아닙니다. new는 헤더 파일에 의존하지 않습니다. C++ 컴파일러는 new를 대상 코드로 컴파일할 수 있습니다(g++4.6.3은 _Znwm 함수를 대상에 삽입합니다. 또한 컴파일러는 유형에 따라 해당 구조도 삽입합니다). 매개변수).

사용 측면에서 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) * 128);
//分配128个(可根据实际需要替换该数值)整型存储单元,
//并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd = (double*)malloc(sizeof(double) * 12);
//分配12个double型存储单元,
//并将首地址存储到指针变量pd中

먼저, malloc 함수는 void * 유형을 반환합니다.

C++의 경우 p = malloc (sizeof(int));라고 쓰면 프로그램을 컴파일할 수 없으며 "void*는 int * 유형 변수에 할당할 수 없습니다."라는 오류 메시지가 보고됩니다.

따라서 캐스팅하려면 (int *)를 사용해야 합니다. C의 경우에는 그런 요구 사항이 없지만, C 프로그램을 C++로 이식하는 것이 더 편리하도록 하려면 강제 변환하는 습관을 기르는 것이 좋습니다.

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

malloc(0)의 특별한 경우에 주의해야 합니다. 반환 값은 NULL이거나 유효한 주소일 수 있습니다(안전하게 해제할 수 있지만 역참조할 수는 없음). malloc(-1)은 금지되지 않습니다. 매개변수는 음수인 경우 매우 큰 양수로 변환될 수 있습니다. 결국 큰 값이 없기 때문에 NULL이 반환됩니다. 메모리 블록이 충분합니다.

표준 프로그램에서는 다음 형식으로 malloc과 free를 사용해야 합니다.

type *p;
if(NULL == (p = (type*)malloc(sizeof(type))))
/*请使用if来判断,这是有必要的*/
{
    perror("error...");
    exit(1);
}
.../*其它代码*/
free(p);
p = NULL;/*请加上这句*/

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

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

int *p = (int*)malloc(sizeof(int) * 100);
//分配可以放得下100个整数的内存空间。

직접적으로 볼 수 없는 또 다른 차이점은 malloc은 메모리만 할당하고 결과 메모리를 초기화할 수 없기 때문에 얻은 ​​새 메모리에서 해당 값은 무작위입니다. .

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

특별한 경우를 만들어 보완해 보세요

char *ptr;
if((ptr = (char*)malloc(0)) == NULL)
    puts("Gotanullpointer");
else
    puts("Gotavalidpointer");

이때 Got a valid 포인터를 받을 수도 있고, Got a null 포인터를 받을 수도 있습니다.

작동 메커니즘

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

Linux Libc6采用的机制是在free的时候试图整合相邻的碎片,使其合并成为一个较大的free空间。

程序示例

正常程序

typedef struct data_type{
    int age;
    char name[20];
}data;
data*bob=NULL;
bob=(data*)malloc(sizeof(data));
if(bob!=NULL)
{
    bob->age=22;
    strcpy(bob->name,"Robert"); 
    printf("%s is %d years old.\n",bob->name,bob->age);
}
else
{
    printf("mallocerror!\n");
    exit(-1);
}  
free(bob);
bob=NULL;

输出结果:Robert is 22 years old.

内存泄漏实例

#include <stdio.h>
#include <malloc.h>
#define MAX 100000000int main(void)
{
    int *a[MAX] = {NULL};
    int i;
    for(i=0;i<MAX;i++)
    {
    a[i]=(int*)malloc(MAX);
    }
    return 0;
}

注:malloc申请之后没有检测返回值。

推荐教程:C#视频教程

위 내용은 malloc 함수 활용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
C# .NET의 지속적인 관련성 : 현재 사용법을 살펴보십시오.C# .NET의 지속적인 관련성 : 현재 사용법을 살펴보십시오.Apr 16, 2025 am 12:07 AM

C#.NET은 여러 응용 프로그램 개발을 지원하는 강력한 도구 및 라이브러리를 제공하기 때문에 여전히 중요합니다. 1) C#은 .NET 프레임 워크를 결합하여 개발 효율적이고 편리하게 만듭니다. 2) C#의 타입 안전 및 쓰레기 수집 메커니즘은 장점을 향상시킵니다. 3) .NET은 크로스 플랫폼 실행 환경과 풍부한 API를 제공하여 개발 유연성을 향상시킵니다.

웹에서 데스크톱으로 : C# .NET의 다양성웹에서 데스크톱으로 : C# .NET의 다양성Apr 15, 2025 am 12:07 AM

C#.NETISVERSATILEFORBOTHWEBBANDDESKTOPDEVENTROMMENT.1) FORWEB, useASP.NETFORRICHINTERFACES.3) FORDESKTOP.3) USEXAMARINFORCROSS-PLATFORMDEEVENTRIMMENT, LINABILEDEV, MACODEDEV, and MACODEDOWS, 및 MACODEDOWS.

C# .net 및 미래 : 신기술에 적응C# .net 및 미래 : 신기술에 적응Apr 14, 2025 am 12:06 AM

C# 및 .NET는 지속적인 업데이트 및 최적화를 통해 신흥 기술의 요구에 적응합니다. 1) C# 9.0 및 .NET5는 레코드 유형 및 성능 최적화를 소개합니다. 2) .NETCORE는 클라우드 네이티브 및 컨테이너화 된 지원을 향상시킵니다. 3) ASP.NETCORE는 최신 웹 기술과 통합됩니다. 4) ML.NET는 기계 학습 및 인공 지능을 지원합니다. 5) 비동기 프로그래밍 및 모범 사례는 성능을 향상시킵니다.

c# .net이 당신에게 적합합니까? 적용 가능성을 평가합니다c# .net이 당신에게 적합합니까? 적용 가능성을 평가합니다Apr 13, 2025 am 12:03 AM

C#.netissuitable forenterprise-levelapplications는 richlibraries, androbustperformance, 그러나 itmaynotbeidealforcross-platformdevelopmentorwhenrawspeediscritical, wherelanguagesslikerustorthightordogrordogrognegrognegrognegrognecross-platformdevelopmentor.

.NET 내의 C# 코드 : 프로그래밍 프로세스 탐색.NET 내의 C# 코드 : 프로그래밍 프로세스 탐색Apr 12, 2025 am 12:02 AM

.NET에서 C#의 프로그래밍 프로세스에는 다음 단계가 포함됩니다. 1) C# 코드 작성, 2) 중간 언어 (IL)로 컴파일하고 .NET 런타임 (CLR)에 의해 실행됩니다. .NET에서 C#의 장점은 현대적인 구문, 강력한 유형 시스템 및 .NET 프레임 워크와의 긴밀한 통합으로 데스크탑 응용 프로그램에서 웹 서비스에 이르기까지 다양한 개발 시나리오에 적합합니다.

C# .NET : 핵심 개념 탐색 및 프로그래밍 기초C# .NET : 핵심 개념 탐색 및 프로그래밍 기초Apr 10, 2025 am 09:32 AM

C#은 Microsoft가 개발 한 최신 객체 지향 프로그래밍 언어이며 .NET 프레임 워크의 일부로 개발되었습니다. 1.C#은 캡슐화, 상속 및 다형성을 포함한 객체 지향 프로그래밍 (OOP)을 지원합니다. 2. C#의 비동기 프로그래밍은 응용 프로그램 응답 성을 향상시키기 위해 비동기 및 키워드를 기다리는 키워드를 통해 구현됩니다. 3. LINQ를 사용하여 데이터 컬렉션을 간결하게 처리하십시오. 4. 일반적인 오류에는 NULL 참조 예외 및 인덱스 외 예외가 포함됩니다. 디버깅 기술에는 디버거 사용 및 예외 처리가 포함됩니다. 5. 성능 최적화에는 StringBuilder 사용 및 불필요한 포장 및 Unboxing을 피하는 것이 포함됩니다.

C# .NET 응용 프로그램 테스트 : 장치, 통합 및 엔드 투 엔드 테스트C# .NET 응용 프로그램 테스트 : 장치, 통합 및 엔드 투 엔드 테스트Apr 09, 2025 am 12:04 AM

C#.NET 애플리케이션에 대한 테스트 전략에는 단위 테스트, 통합 테스트 및 엔드 투 엔드 테스트가 포함됩니다. 1. 단위 테스트를 통해 MSTEST, NUNIT 또는 XUNIT 프레임 워크를 사용하여 코드의 최소 단위가 독립적으로 작동합니다. 2. 통합 테스트는 일반적으로 사용되는 시뮬레이션 된 데이터 및 외부 서비스를 결합한 여러 장치의 기능을 확인합니다. 3. 엔드 투 엔드 테스트는 사용자의 완전한 작동 프로세스를 시뮬레이션하며 셀레늄은 일반적으로 자동 테스트에 사용됩니다.

Advanced C# .NET 튜토리얼 : ACE 귀하의 다음 선임 개발자 인터뷰Advanced C# .NET 튜토리얼 : ACE 귀하의 다음 선임 개발자 인터뷰Apr 08, 2025 am 12:06 AM

C# 수석 개발자와의 인터뷰에는 비동기 프로그래밍, LINQ 및 .NET 프레임 워크의 내부 작업 원리와 같은 핵심 지식을 마스터하는 것이 필요합니다. 1. 비동기 프로그래밍은 비동기를 통해 작업을 단순화하고 응용 프로그램 응답 성을 향상시키기 위해 기다리고 있습니다. 2.linq는 SQL 스타일로 데이터를 운영하고 성능에주의를 기울입니다. 3. Net Framework의 CLR은 메모리를 관리하며 가비지 컬렉션은주의해서 사용해야합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)