'sizeof'오류 전에 realloc 예상 선언 지정자 또는 '…'을 수정하는 방법은 무엇입니까?
전화 한 후 아래 오류가 발생합니다. realloc
void* realloc(sizeof(char)100);
오류:
linex.c : 23 : 16 : 오류 : 예상 선언 지정자 또는 'sizeof'앞에 '...'
도와주세요. 감사합니다. :)
답변
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 ()은 메모리를 어떻게 재 할당합니까?
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
표현식을 간과하여 버그가 발생할 가능성을 줄 이므로 일반적으로 바람직합니다 .