malloc / calloc [duplicate] 호출을 통해 요소가 개별적으로 메모리에 할당 된 전체 배열을 어떻게 해제합니까?

Aug 16 2020

내가 아는 바에 따르면 malloc과 calloc은 기본 메모리에 API를 보관하는 책일뿐입니다. 이것을 염두에두고, free ()를 호출하면 malloc (또는 calloc)에 대한 독립적 인 호출을 통해 개별 요소에 메모리가 할당 된 전체 배열이 해제되는지 궁금합니다.

정확히 다음 코드가 있습니다.

int *num,* num_start;

num_start=num;

for(i=0;i<N;i++)
{
    num = (int *)calloc(0, sizeof(int));
    num++;
}

free(num_start);

free(num_start)동적으로 독립적으로 공간을 할당 된 N 정수 요소의 전체 배열을 확보?

답변

1 P__JsupportswomeninPoland Aug 16 2020 at 10:09

게시 한 "코드"는 의미가 없으며 잘못되었습니다.

int *num, num_start;
num_start=num;

num_start는 포인터가 아닌 정수입니다.

for(i=0;i<N;i++)
{
    num = (int *)calloc(0, sizeof(int));
    num++;
}

솔직히 말해서이 코드가 무엇을해야하는지 이해하지 못하지만 확실히 잘못되었습니다.

N정수에 메모리를 할당하려면

int *num = calloc(N, sizeof(*num));

그리고 자유를 얻으려면

free(num);

또는 N 개의 포인터를 N 개의 정수에 저장하도록 포인터를 할당하려는 경우

int **allocate(size_t N)
{
    int **num = malloc(N * sizeof(*num));
    for(size_t i=0; i<N; i++)
    {
        num[i] = calloc(N, sizeof(**num));
    }
    return num;
}

void arrayfree(int **num, size_t size)
{
    for(size_t i = 0; i < size; i++)
    {
        free(num[i]);
    }
    free(num);
}

메모리를 할당 할 때 작업이 성공했는지 확인해야합니다. 이러한 검사는 코드를 더 쉽게 읽을 수 있도록 예제에 포함되어 있지 않습니다.

tadman Aug 16 2020 at 09:55

calloc()malloc()기능은 메모리를 해제하는 손잡이 역할도 할당에 대한 포인터를 반환한다. 포인터를 자유롭게 복사하고 적절하다고 생각되는대로 조작 할 수 있지만를 호출 할 때 free()원래 값을 제공해야합니다 .

즉, 이것이 작동한다고 말하는 것입니다.

// Original allocation
int* x = calloc(42, sizeof(int));

// Making a new (independent) copy of the pointer to a new pointer
int* p = x;

// Arbitrary pointer manipulation and mangling
x++;

// Freeing with the copied value
free(p);

원래 목적지로 돌아가는 한 약간 모험심을 가질 수도 있습니다.

int* x = calloc(42, sizeof(int));

x += 40;
x -= 30;
x += 10;
x -= 13;
x -= 7;

free(x);

x짧은 여행 후 원래 가치로 돌아온 곳 . 일반적으로 나중에 다시 구성하는 것보다 원래 포인터를 유지하는 것이 좋습니다. 조작하려는 경우 사본을 만드십시오.