programing

언제 C에서 malloc을 사용해야 하고 사용하지 말아야 하나요?

newsource 2022. 7. 28. 23:55

언제 C에서 malloc을 사용해야 하고 사용하지 말아야 하나요?

malloc()의 동작은 이해합니다.내 질문은 이런 걸 보게 될 거란 거야

#define A_MEGABYTE (1024 * 1024)

char *some_memory;
size_t size_to_allocate = A_MEGABYTE;
some_memory = (char *)malloc(size_to_allocate);
sprintf(some_memory, "Hello World");
printf("%s\n", some_memory);
free(some_memory);

간결하게 하기 위해 오류 확인을 생략했습니다.메모리의 정적 스토리지에 대한 포인터를 초기화함으로써 위의 작업을 수행할 수 없습니까?아마도:

char *some_memory = "Hello World";

유지해야 할 값을 선언/초기화하는 대신 실제로 메모리를 할당해야 하는 시점은 언제입니까?

char *some_memory = "Hello World";

문자열 상수에 대한 포인터를 만들고 있습니다.즉, "Hello World" 문자열은 메모리의 읽기 전용 부분 어딘가에 있으며 포인터만 있으면 됩니다.문자열은 읽기 전용으로 사용할 수 있습니다.변경할 수 없습니다.예:

some_memory[0] = 'h';

화를 자초하는 거야

반면에

some_memory = (char *)malloc(size_to_allocate);

는 할당된 메모리에 char 배열(변수)과 some_memory 포인트를 할당하고 있습니다.이 어레이는 읽기 및 쓰기 모두 가능합니다.다음 작업을 수행할 수 있습니다.

some_memory[0] = 'h';

어레이의 내용이 「hello World」로 바뀝니다.

정확히 말하자면, malloc은 거의 쓸모가 없다.

malloc이 필요한 주된 이유는 코드 스코프와 다른 라이프 타임을 가질 필요가 있는 데이터가 있는 경우입니다.당신의 코드는 하나의 루틴에서 malloc을 호출하고 포인터를 어딘가에 저장하며 결국 다른 루틴에서 무료 호출을 합니다.

두 번째 이유는 C가 스택에 할당에 충분한 공간이 남아 있는지 여부를 알 수 없기 때문입니다.코드가 100% 견고해야 할 경우 malloc을 사용하는 것이 안전합니다.그렇게 하면 코드가 할당 실패를 인식하고 처리할 수 있기 때문입니다.

malloc은 실행 시 메모리를 할당, 재할당 및 해방하기 위한 훌륭한 도구입니다.hello world의 예와 같은 정적 선언은 컴파일 시에 처리되므로 크기를 변경할 수 없습니다.

따라서 Malloc은 파일 내용을 읽거나 소켓을 다루는 등 임의의 크기의 데이터를 처리할 때 항상 유용합니다. 처리해야 할 데이터의 길이를 알지 못합니다.

물론 당신이 제시한 것과 같은 간단한 예에서 malloc은 "올바른 작업에 적합한 도구"가 아닙니다.그러나 좀 더 복잡한 경우(예를 들어 실행 시 임의의 크기의 어레이를 작성하는 경우)에는 malloc이 유일한 방법입니다.

는, 한 할당이 필요합니다( 「동적 할당이 합니다.malloc예를 들면, 유저가 애플리케이션의 파일을 여는 경우가 있습니다.파일의 내용을 메모리로 읽어야 하지만 사용자가 런타임에 즉석에서 파일을 선택하기 때문에 파일의 크기를 미리 알 수 없습니다.으로는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★malloc부분은 '이렇게 하다'를 사용하는 주된 일 거예요.malloc컴파일 시에 사이즈를 이미 알고 있는(및 변경을 원하지 않는) 단순한 문자열의 예에서는 동적으로 할당하는 것은 그다지 의미가 없습니다.


...하셔야 합니다.malloc 합니다. 이치노

int do_something() {
    uint8_t* someMemory = (uint8_t*)malloc(1024);

    // Do some stuff

    if ( /* some error occured */ ) return -1;

    // Do some other stuff

    free(someMemory);
    return result;
}

이코코 가가 ?제 제? ???은요,조건반환문입니다.malloc ★★★★★★★★★★★★★★★★★」free처음에는 괜찮아 보일지 모르지만 생각해 보세요.에러가 발생했을 경우는, 할당한 메모리를 해방하지 않고 돌아옵니다.이것은 메모리 누수의 일반적인 원인입니다.

예이고,알 수 에는 포인터가 있다고 . 하지만 수백 줄의 코드가 포인터로 뒤섞여 있다고 상상해 보십시오.mallocs,free및 모든 종류의 오류 처리.보다 현대의 C++를 더 하지 않은 주제입니다.이것이 해당 사례에서 C보다 현대적인 C++를 선호하는 이유 중 하나이지만, 그것은 전혀 다른 주제입니다.

항상 하실 때malloc이 '기억력'이free는 가능한 한d로 설정합니다.

메모리를 할당해야 하는 이유 중 하나는 실행 시 메모리를 변경하는 것입니다.이 경우 스택상의 malloc 또는 버퍼를 사용할 수 있습니다.포인터에 "Hello World"를 할당하는 간단한 예에서는 런타임에 "일반적으로" 수정할 수 없는 메모리를 정의합니다.

char *some_memory = "Hello World";
sprintf(some_memory, "Goodbye...");

입니다.const.

그러면 스택 또는 (선언된 위치에 따라) 글로벌하게 12바이트 문자 배열이 할당됩니다.

char some_memory[] = "Hello World";

추가 조작을 위한 여지를 남겨두고 싶은 경우는, 어레이의 사이즈를 크게 하도록 지정할 수 있습니다(단, 스택에 1MB를 추가하지 말아 주세요).

#define LINE_LEN 80

char some_memory[LINE_LEN] = "Hello World";
strcpy(some_memory, "Goodbye, sad world...");
printf("%s\n", some_memory);

언급URL : https://stackoverflow.com/questions/1963780/when-should-i-use-malloc-in-c-and-when-dont-i