'sizeof'오류 전에 realloc 예상 선언 지정자 또는 '…'을 수정하는 방법은 무엇입니까?

Aug 15 2020

전화 한 후 아래 오류가 발생합니다. realloc

void* realloc(sizeof(char)100);

오류:

linex.c : 23 : 16 : 오류 : 예상 선언 지정자 또는 'sizeof'앞에 '...'

도와주세요. 감사합니다. :)

답변

1 RobertSsupportsMonicaCellio Aug 15 2020 at 15:42
void realloc(sizeof(char)100);

표준 realloc()함수 (custom 선언이 아님)에 대한 호출을 의미하고 realloc()메모리 크기를 조정하려는 경우이 코드는 세 점과 관련하여 잘못되었습니다.

1.

realloc() 메모리 관리에 의해 할당되고 이미 첫 번째 인수로 해제되지 않은 메모리에 대한 포인터가 필요합니다.

이것은 표준 realloc()함수 의 프로토 타입 / 선언입니다 .

void *realloc( void *ptr, size_t new_size );

귀하의 realloc()호출이 포인터 인수를 생략합니다.

2.

void *함수를 호출 할 때 반환 유형 (여기 )을 지정하지 마십시오 . 이것 realloc()으로 호출이 아닌 함수의 새로운 선언을 시도합니다 .

여기에서 캐스팅을 시도했다면 이것도 잘못되었습니다. 암시 적 캐스트의 경우 캐스트 할 유형을 괄호로 묶어야 (void *)합니다.

두 경우 모두 캐스트가 중복됩니다. 반환 유형의 캐스트를 보려면 다음을 살펴보십시오.

  • malloc의 결과를 캐스팅합니까?

삼.

size 인수 *에는 sizeof(char)과 사이 의 연산자가 필요합니다 100.


사용하다:

realloc( ptr, sizeof(char) * 100 );

또한 오류 발생 여부에 관계없이 항상 메모리 관리 함수의 반환 값을 확인해야합니다.

char * ptr2 = realloc( ptr1, sizeof(char) * 100);
if ( ptr2 == NULL )
{
    fputs("Error at resizing the allocated memory!\n", stderr);
    // error routine.
}

같은 항상 을 위해 수행해야합니다 malloc():

char * ptr1 = malloc( sizeof(char) * 50);
if ( ptr1 == NULL )
{
    fputs("Error at memory allocation!\n", stderr);
    // error routine.
}

고급 레슨 (이 시점에서 이해할 필요는 없습니다) :

의 경우 realloc()다른 포인터를 사용하여의 반환 값을 잡습니다 realloc().

이는 realloc()인수로 전달 된 동일한 포인터를 반환하거나 반환하지 않을 수 있기 때문 입니다.

안타깝게도 일반적이지만 나쁜 습관은의 반환 값에 의해 첫 번째 인수로 전달 된 포인터를 다시 할당하는 것입니다 realloc().

이것은 처음 할당 된 메모리에 대한 참조가 realloc()다른 "교체"메모리를 할당했지만 첫 번째 메모리를 지우지 않은 경우 손실 될 수 있기 때문에 위험 합니다.

관련 :

  • realloc ()에 의해 반환 된 주소를 동일한 포인터에 할당하는 것이 좋은 코딩 습관입니까?
  • https://stackoverflow.com/a/25435175/12139179
  • realloc ()은 메모리를 어떻게 재 할당합니까?
1 EricPostpischil Aug 15 2020 at 17:35

void* realloc(sizeof(char)*100); 함수를 선언하고 호출하는 것입니다.

함수 를 선언 할 때에서 와 같이 반환 유형과 매개 변수 유형을 말합니다 void *realloc(void *, size_t);. 에서와 같이 유용한 설명으로 매개 변수에 대한 자리 표시 자 이름을 제공 할 수도 있습니다 void *realloc(void *pointer, size_t size);. (함수를 완전히 정의 할 때 매개 변수 이름이 필요합니다.)

함수 를 호출 할 때 반환 값이나 매개 변수에 대한 유형 이름을 제공하지 않습니다. 에서와 같이 인수 값을 제공하는 표현식 만 제공합니다 NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);.

때로는 유형 이름이 함수 호출 내부 또는 근처에 나타날 수 있지만 이는 부수적이며 함수 호출의 직접 부분이 아닙니다. 예 :

  • char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);:이 코드는이 char *이 선언하고 정의하기 때문에 NewPointer. 그런 다음 호출 NewPointer로 초기화됩니다 realloc.
  • NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);:이 코드는 (char *)의 반환 값을 realloc특정 포인터 유형 으로 변환하는 캐스트로 있습니다. C에서는 필요하지 않습니다.
  • NewPointer = realloc(OldPointer, 100 * sizeof(char));:이 코드에는 필요한 공간을 계산 char *하기위한 피연산자가 sizeof있습니다. 이는 크기를으로 가져올 수 있기 때문에 필요하지 sizeof *NewPointer않으며 일반적으로의 선언의 변경 사항에 따라 자동으로 조정되므로의 선언 NewPointer에서 유형을 변경 NewPointer하지만 sizeof표현식을 간과하여 버그가 발생할 가능성을 줄 이므로 일반적으로 바람직합니다 .