sourcetip

C의 함수에서 재할당을 사용하는 방법

fileupload 2023. 7. 22. 10:21
반응형

C의 함수에서 재할당을 사용하는 방법

여기서 배운 것을 바탕으로 C의 함수를 통해 동적 배열을 조작합니다.

void test(int data[])
{
    data[0] = 1;    
}    

int main(void)
{    
    int *data = malloc(4 * sizeof *data);

    test(data);

    return 0;
}

이것은 잘 작동합니다.하지만, 저는 또한 사용하려고 노력하고 있습니다.realloc행사 중에

void increase(int data[])
{
    data = realloc(data, 5 * sizeof *data);    
}

이는 준수하지만 실행 시 프로그램이 충돌합니다.

질문.

기능에서 재할당을 어떻게 사용해야 합니까?

저는 제가 그 결과를 할당해야 한다는 것을 이해합니다.realloc변수로 이동하여 변수인지 확인합니다.NULL먼저, 이것은 단순화된 예에 불과합니다.

다음 값을 수정하려고 합니다.int*(어레이) 그래서 그것에 대한 포인터를 당신에게 전달해야 합니다.increase함수:

void increase(int** data)
{
    *data = realloc(*data, 5 * sizeof int);
}

호출 코드는 다음과 같습니다.

int *data = malloc(4 * sizeof *data);
/* do stuff with data */
increase(&data);
/* more stuff */
free(data);

포인터와 배열의 차이에 유의하십시오.
어레이는 스택에 있는 메모리의 척(chuck)일 뿐입니다.배열이 있는 경우:

int arr[100];

그러면 arr는 메모리의 주소이지만 &arr도 메모리의 주소이며 메모리의 주소는 일정하며 어떤 위치에도 저장되지 않습니다.그래서 당신은 arr=라고 말할 수 없습니다.NULL입니다. arr은 어떤 것을 가리키는 변수가 아니기 때문입니다.이것은 단지 상징적인 주소일 뿐입니다. 배열이 시작되는 주소입니다.대신 포인터는 자체 메모리를 가지고 있으며 메모리 주소를 가리킬 수 있습니다.

이제 int[]를 int*로 바꾸는 것으로 충분합니다.
또한 변수는 복사본으로 전달되므로 함수에 int**를 전달해야 합니다.

재할당을 사용하는 방법에 대해 모든 교훈적인 예는 다음과 같습니다.

  1. 재할당 사용;
  2. NULL인지 확인합니다.이 경우 오류를 사용하고 프로그램을 종료합니다.
  3. NULL이 아닌 경우 할당된 메모리를 사용합니다.
  4. 더 이상 필요하지 않을 때 메모리를 확보합니다.

이것이 좋은 예입니다.

int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc,
              // casting is optional but I'd suggest it for readability
assert(chuck);
for(unsigned int i=0; i<10; i++)
{
    chunk[i]=i*10;
    printf("%d",chunk[i]);
}
free(chunk);

두 코드 모두 매우 문제가 있습니다. 동일한 포인터를 사용하여 재할당에서 보내고 받는 경우 실패하면 나중에 포인터를 해제할 수 없게 됩니다.

당신은 다음과 같은 것을 해야 합니다:

{ ... ...

more = realloc(area , size);
if( more == NULL )
    free(area);
else
    area=more;

... ...

}

언급URL : https://stackoverflow.com/questions/13748338/how-to-use-realloc-in-a-function-in-c

반응형