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**를 전달해야 합니다.
재할당을 사용하는 방법에 대해 모든 교훈적인 예는 다음과 같습니다.
- 재할당 사용;
- NULL인지 확인합니다.이 경우 오류를 사용하고 프로그램을 종료합니다.
- NULL이 아닌 경우 할당된 메모리를 사용합니다.
- 더 이상 필요하지 않을 때 메모리를 확보합니다.
이것이 좋은 예입니다.
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
'sourcetip' 카테고리의 다른 글
파이썬에서 'r'은 문자열 앞에 무엇을 나타냅니까? (0) | 2023.07.22 |
---|---|
리눅스 티는 파이썬과 함께 작동하지 않습니까? (0) | 2023.07.22 |
특정 장치에 있는 레코드에 따라 비디오 레코드의 모든 형제를 쿼리합니다. (0) | 2023.07.22 |
json 배열에서 mariadb의 JSON 함수를 사용하여 레코드를 검색하는 방법 (0) | 2023.07.22 |
오라클 실행 계획 (0) | 2023.07.22 |