NAME

alloca - 자동으로 해제되는 메모리 할당하기

SYNOPSIS

#include <alloca.h>

void *alloca(size_t size);

DESCRIPTION

alloca() 함수는 호출자의 스택 프레임에 size 바이트의 공간을 할당한다. alloca()를 호출했던 함수가 자기 호출자에게 반환할 때 그 임시 공간이 자동으로 해제된다.

RETURN VALUE

alloca() 함수는 할당된 공간의 시작점에 대한 포인터를 반환한다. 할당으로 인해 스택 오버플로가 발생하는 경우 프로그램 동작 방식은 규정돼 있지 않다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
alloca() 스레드 안전성 MT-Safe

CONFORMING TO

POSIX.1에는 이 함수가 없다.

32V, PWB, PWB.2, 3BSD, 4BSD에 alloca() 함수가 있었다는 증거가 있다. 4.3BSD에 맨 페이지가 있다. 리눅스에서는 GNU 버전을 사용한다.

NOTES

alloca() 함수는 머신 의존적이고 컴파일러 의존적이다. 어떤 응용에서는 이를 사용하는 것이 malloc(3)free(3)를 쓰는 것에 비해 효율성이 높을 수 있다. 어떤 경우에는 longjmp(3)siglongjmp(3)를 쓰는 응용에서 메모리 해제가 단순해지기도 한다. 그 밖의 경우에는 사용을 권하지 않는다.

alloca()로 할당한 공간이 스택 프레임에서 할당되기 때문에 longjmp(3)siglongjmp(3) 호출로 함수 반환을 건너뛰면 그 공간이 자동으로 해제된다.

alloca()로 할당한 공간을 가리키는 포인터의 스코프를 벗어난다고 그 공간이 자동으로 해제되는 게 아니다.

alloca()로 할당한 공간을 free(3) 해선 안 된다!

GNU 버전에 대한 참고 사항

보통은 gcc(1)alloca() 호출을 인라인 코드로 변환한다. -ansi, -std=c89, -std=c99, -std=c11 중 한 옵션을 주고 <alloca.h> 헤더를 포함 안 하면 변환이 이뤄지지 않는다. 아니면 (-ansi-std=c* 옵션이 없으면) glibc 버전 <stdlib.h>에서 <alloca.h>를 포함시키는데 그 파일에 다음 행이 있다.

#ifdef __GNUC__
#define alloca(size)   __builtin_alloca (size)
#endif

그래서 이 함수의 자체 버전을 가지고 있으면 상황이 복잡해진다.

코드가 인라인이 된다는 것은 이 함수의 주소를 얻는 것이, 그리고 다른 라이브러리를 링크해서 함수의 동작 방식을 바꾸는 것이 불가능하다는 의미다.

그 인라인 코드는 많은 경우 스택 포인터를 조정하는 인스트럭션 한 개로 이뤄져 있고 스택 오버플로를 검사하지 않는다. 따라서 NULL 오류 반환이 없다.

BUGS

스택 프레임을 확장할 수 없는 경우 오류 표시가 없다. (하지만 아마 할당 실패 후에 프로그램이 할당 안 된 공간에 접근하려 하면서 SIGSEGV를 받게 될 것이다.)

많은 시스템에서는 함수 호출 인자 목록 안에서 alloca()를 쓸 수 없는데, 그러면 alloca()가 예약한 공간이 스택에서 함수 인자들을 위한 공간 중간에 있게 될 것이기 때문이다.

SEE ALSO

brk(2), longjmp(3), malloc(3)


2021-03-22