programing

언제 왜 malloc을 사용합니까?

goodsources 2022. 8. 1. 22:48
반응형

언제 왜 malloc을 사용합니까?

언제, 왜안 돼요.malloc.

제 코드는 다음과 같습니다.

#include <stdlib.h>

int main(int argc, const char *argv[]) {

  typedef struct {
    char *name;
    char *sex;
    int age;
  } student;


  //Now I can do two things
  student p;

  //or
  student *ptr = (student *)malloc(sizeof(student));

  return 0;
}

「메모리 할당」을 사용할 수, 이유는 입니까?student p;

malloc이치하다앞에서 설명한 바와 같이 동적 할당은 실행 시 메모리를 할당하는 것을 의미합니다.예를 들어 컴파일 시간 동안 메모리 양을 모르는 경우 등입니다.

한 가지 예로 이 문제를 해결할 수 있습니다.최대 20명의 학생이 있을 것이라고 가정해 보자.따라서 정적 요소 20개를 사용하여 배열을 만들 수 있습니다.어레이는 최대 20명의 학생을 수용할 수 있습니다.하지만 만약 여러분이 학생 수를 모른다면요?첫 번째 입력이 학생 수라고 합시다.10분, 20분, 50분, 50분, 50분, 10분, 20분, 50분, 50분.n= 수를 하고 그 해 보겠습니다.malloc.

이것은 단지 하나의 예에 불과하다.이와 같은 상황에서는 동적 할당이 필요합니다.

man 페이지 malloc(3)를 확인합니다.

은 you 다 you you youmalloc현재 블록의 실행 수명을 초과하여 존재할 필요가 있는 오브젝트를 할당해야 하는 경우(복사 시 비용이 많이 든다), 또는 해당 스택의 크기보다 큰 메모리를 할당해야 하는 경우(즉, 3MB 로컬스택 어레이는 좋지 않습니다).

C99가 VLA를 도입하기 전에는 동적 크기의 어레이를 할당하기 위해서도 필요했습니다만, 많은 시스템에서 사용되는 트리, 리스트, 큐 등의 동적 데이터 구조를 작성하기 위해서는 어레이가 필요합니다.아마 더 많은 이유가 있을 것이다. 이것들은 단지 몇 가지일 뿐이다.

다른 측면을 고려하여 이 문제에 대처해 봅시다.

크기

malloc를 사용하면 용량보다 큰 할 수 있습니다.student p; ★★★★★★★★★★★★★★★★★」int x[n];는 ★★★★★★★★★★★★★★★★★★★★.malloc합니다.

C 프로그래밍 언어는 메모리를 정적, 자동 또는 동적으로 관리합니다.정적 기간 변수는 보통 프로그램의 실행 가능 코드와 함께 메인 메모리에 할당되며 프로그램의 수명 동안 지속됩니다. 자동 기간 변수는 함수가 호출되고 반환될 때 스택에 할당되고 오고 갑니다.정적 기간 및 자동 기간 변수의 경우 할당 크기는 컴파일 시간 상수여야 합니다(변수 길이 자동 배열의 경우 제외).런타임까지 필요한 크기를 알 수 없는 경우(예를 들어 임의의 크기의 데이터를 사용자 또는 디스크 파일에서 읽는 경우) 고정 크기의 데이터 개체를 사용하는 것은 적절하지 않습니다.(Wikipedia에서)

범위

일반적으로 선언된 변수는 선언된 블록 뒤에 삭제/자유화됩니다(스택에서 선언됨).가 할당되어 있는 에는, 「메모리가 할당되어 있습니다.malloc이치노

이는 함수에서 변수/어레이/구조를 생성하여 주소를 반환할 수 없음을 의미합니다(이 함수가 가리키는 메모리가 해방될 수 있음).컴파일러는 다음과 같은 경고를 함으로써 이 문제에 대해서도 경고하려고 합니다.

경고 - 로컬 변수 'matches'와 연관된 스택 메모리의 주소가 반환되었습니다.

자세한 내용은 여기를 참조해 주세요.

변경( 「 」 )realloc)

짐작하신 바와 같이, 보통 방법으로는 불가능합니다.

에러 검출

할 수 으로 인해 가 있습니다.malloc a반다 will will will will will will 。NULL할 수 있습니다.

나중에 문자열 내용을 변경하는 중

하면 store를 합니다.char *some_memory = "Hello World"; 수 없다some_memory[0] = 'h';문자열 상수로 저장되고 저장되는 메모리는 읽기 전용입니다.대신 malloc을 사용하면 나중에 내용을 변경할 수 있습니다.자세한 내용은 이 답변을 참조하십시오.

가변 크기 어레이에 대한 자세한 내용은 여기를 참조하십시오.

이 예의 구조를 조금 더 확장하면 다음과 같이 생각할 수 있습니다.

#include <stdio.h>

int main(int argc, const char *argv[]) {

typedef struct {
 char* name;
 char* sex;
 char* insurace;
 int age;
 int yearInSchool;
 float tuitionDue;
}student;


//Now I can do two things
student p;

//or
student *p = malloc(sizeof *p);

}

C a는 참조가 아닌 값에 따라 암묵적으로 전달되는 언어입니다.이 예에서는 함수에서 작업을 수행하기 위해 'p'를 전달하면 구조 전체의 복사본이 생성됩니다.이 경우 추가 메모리(특정 구조에 필요한 공간의 합계)가 사용되며 속도가 느리고 확장성이 좋지 않을 수 있습니다(분만에 더 많은 메모리).그러나 *p를 통과한다고 해서 전체 구조를 통과하지는 않습니다.이 구조를 참조하는 메모리 내의 주소만 전달합니다.전달되는 데이터의 양(포인터의 크기)이 작기 때문에, 조작이 고속입니다.

이것을 알고 있는 프로그램을 상상해 보세요(학생 정보 시스템 등). 수천, 수만 개의 레코드를 만들고 관리해야 합니다.전체 구조를 값으로 전달하면 데이터 집합을 조작하는 데 각 레코드에 포인터를 전달하는 것보다 시간이 더 오래 걸립니다.

malloc = Memory ALLOCation.

다른 프로그래밍 언어를 사용했다면new키워드를 지정합니다.

말록은 C에서도 똑같은 일을 합니다.할당해야 할 메모리 크기 파라미터를 사용하여 메모리 블록 전체의 첫 번째 메모리 블록을 가리키는 포인터 변수를 반환합니다.예 -

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

지금이다,*p는 메모리에 예약된 연속 10개의 정수 블록 중 첫 번째 블록을 가리킵니다.

각 할 수 .++ ★★★★★★★★★★★★★★★★★」--환입니니다다

행운을 빌어요.

이 예에서 그것은 정말 쓸모없어 보인다.그러나 소켓 또는 파일 IO를 사용하고 있으며 실행 중에만 저지할 수 있는 가변 길이의 패킷을 읽어야 한다고 가정합니다.또는 소켓을 사용하는 경우, 각 클라이언트 접속에 서버상의 스토리지가 필요합니다.정적 어레이를 만들 수 있지만 컴파일 시 방해가 되는 클라이언트 제한이 있습니다.

malloc은 현재 블록의 실행 수명을 초과하여 존재해야 하는 개체를 할당해야 하거나(복사 시 비용이 많이 든다), 또는 해당 스택 크기보다 큰 메모리를 할당해야 할 때 사용합니다.

언급URL : https://stackoverflow.com/questions/8800482/when-and-why-to-use-malloc

반응형