견적 :K & R에서 문장의 정확성에 대해 확실치 않은 | 포인터 연산 | 절차를 확보
테스트 경우 (allocbuf + ALLOCSIZE - allocp> = N) { 확인 n 개의 문자에 대한 요구를 만족시키기에 충분한 공간이 있는지. 존재하는 경우, 의 새로운 값 allocp는 allocbuf의 끝을 초과하여 최대 하나가됩니다. 이 관련
코드 :
#define ALLOCSIZE 10000 /* size of available space */
static char allocbuf[ALLOCSIZE]; /* storage for alloc */
static char *allocp = allocbuf; /* next free position */
char *alloc(int n)
/* return pointer to n characters */
{
if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */
allocp += n;
return allocp - n; /* old p */
} else
/* not enough room */
return 0;
}
void afree(char *p) /* free storage pointed to by p */
{
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
그래서 어떻게 allocbuf의 마지막 위치 이상으로 할 수 있는가? 내 의견으로는 allocbuf [9999]
그 이상의 것. allocbuf [10000]가 잘못되어 메모리 누수가 발생했습니다. 맞습니까?
질문의 두 번째 부분 - 그 이름대로 그 기능은 배열의 특정 위치에 저장된 값을 삭제하는 것입니다. 그러나 내가 볼 수 있듯이 배열의 왼쪽에 "녹음 헤드"를 몇 군데 움직일 수 있습니까? 거기에 저장된 데이터는 변경되지 않습니다.
+1, 발견. – perilbrain
'allocp'가'allocbuf [10000]'을 가리키면 저장소가 완전히 사용되었다는 것을 의미합니다. 마지막 슬라이스는 정확히'n' 개의 항목을가집니다. 따라서 후속 alloc()은'0'을 반환합니다. 인용문은이 "불법"포인터가 사용되도록 허용되어 있지 않으며 실제로'alloc()'에서 반환되지 않는다고 말합니다. – evnu
FYI는 너를 위해 할당 된 너비보다 큰 메모리에 액세스하는 것이 오버런이며 메모리 누수는 아닙니다. 메모리 누수가 발생하면 할당 된 메모리의 트랙이 손실되어 나중에 해당 메모리를 해제 할 수 없습니다. –