malloc / calloc [duplicate] 호출을 통해 요소가 개별적으로 메모리에 할당 된 전체 배열을 어떻게 해제합니까?
내가 아는 바에 따르면 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 정수 요소의 전체 배열을 확보?
답변
게시 한 "코드"는 의미가 없으며 잘못되었습니다.
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);
}
메모리를 할당 할 때 작업이 성공했는지 확인해야합니다. 이러한 검사는 코드를 더 쉽게 읽을 수 있도록 예제에 포함되어 있지 않습니다.
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
짧은 여행 후 원래 가치로 돌아온 곳 . 일반적으로 나중에 다시 구성하는 것보다 원래 포인터를 유지하는 것이 좋습니다. 조작하려는 경우 사본을 만드십시오.