집 >백엔드 개발 >C#.Net 튜토리얼 >C 언어에서 동적 메모리 할당을 구현하는 방법
C언어에서 동적 메모리 할당을 구현하는 방법
우리는 프로그램을 위해 메모리 공간을 미리 열어두고 운영하는 경우가 많습니다.
int arr[5] ;
이 배열의 경우 정의할 때 미리 공간을 열어두어야 하며, 프로그램 실행 중에 이 할당된 메모리 공간은 함수가 완료될 때까지 공간이 해제되지 않는 한 항상 존재하게 됩니다. 한 가지 문제는 이 배열을 프로그램에서 수정할 수 없다는 것입니다.
이러한 문제로 인해 사용에 불편함이 있어 C에서는 malloc() 함수를 제공하고 있습니다.
malloc() 함수와 관련하여 이 함수는 하나의 매개변수, 즉 필요한 메모리 바이트 수를 허용합니다. 그런 다음 malloc()은 사용 가능한 메모리에서 적절한 크기의 블록을 찾습니다. 이 프로세스에서 malloc()은 해당 메모리의 첫 번째 바이트 주소를 반환할 수 있습니다. 즉, 포인터를 사용하여 작업할 수 있다는 의미입니다. malloc()은 배열 포인터, 구조체 포인터 등을 반환하는 데 사용할 수 있으므로 반환 값의 유형을 적절한 유형에 할당해야 합니다. malloc()이 필요한 공간을 찾을 수 없으면 널 포인터를 반환합니다.
예:
추천 학습: c 언어 비디오 튜토리얼
double *p; p=(double*)malloc(30*sizeof(double));
이 프로그램에서는 먼저 이중 문자 공간 30개를 열고 p가 이 공간의 위치를 가리킵니다. 여기의 포인터는 첫 번째 double 값을 가리킵니다. 우리가 열어놓은 30개의 이중 공간이 전부는 아닙니다. 이는 배열과 같습니다. 배열에 대한 포인터는 전체 배열의 요소가 아닌 배열의 첫 번째 요소 주소를 가리킵니다. 따라서 여기서의 작업은 배열의 경우와 동일합니다.
p[0]은 첫 번째 요소이고 p[1]은 두 번째 요소입니다.
이제 동적 배열을 선언하는 방법을 익힐 수 있습니다.
int arr[n]; p=(int *)malloc(n*sizeof(int)); //我们在这里使用的时候要元素个数乘类型字节长度,这样就达到了动态开辟内存空间。
malloc()을 사용하여 메모리 공간을 연 후에 고려해야 할 것은 메모리 공간을 해제하는 것뿐입니다. 여기서 C는 free() 함수를 제공합니다. free()의 매개변수는 이전 malloc() 함수에 의해 열린 공간을 해제하는 malloc() 함수에 의해 반환된 주소입니다.
예:
위에서 열었던 공간을 해제하려면 이렇게 하면 됩니다.
free(p);
프로그램은 또한 메모리 할당이 실패할 때 프로그램을 종료하는 exit() 함수를 호출합니다.
프로그램 예:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<malloc.h>//malloc()函数被包含在malloc.h里面 #include<stdlib.h> int main(void) { char*a = NULL;//声明一个指向a的char*类型的指针 a = (char*)malloc(100 * sizeof(char));//使用malloc分配内存的首地址,然后赋值给a if (!a)//如果malloc失败,可以得到一些log { perror("malloc"); return-1; } sprintf(a, "%s", "HelloWorld\n");//"HelloWorld\n"写入a指向的地址 printf("%s\n", a);//输出用户输入的数据 free(a);//释放掉使用的内存地址 system("pause"); return 0;//例2有无内存泄露? }
이 프로그램은 주로 잘못된 malloc 반환 값 조건을 감지하는 데 사용됩니다.
여기서 C에서 유형 할당(char *)은 선택 사항이지만 C++에서는 필수이므로 유형 할당을 사용하면 C 프로그램을 C++로 포팅하는 것이 더 쉬워집니다.
프로그램 유연성을 얻으려면 주로 동적 배열을 사용하세요. 필요한만큼 배열을 만들 수 있습니다. 공간을 낭비할 필요가 없습니다.
더 많은 프로그래밍 입문 튜토리얼을 보려면 PHP 중국어 웹사이트를 주목하세요!
위 내용은 C 언어에서 동적 메모리 할당을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!