왜 sbrk(0)를 두 번 호출하면 다른 값을 얻을 수 있습니까?
sbrk()
를 공부할 때 우리는 다음과 같이 알고 있다.void *sbrk (intptr_t increment);
그러면 테스트 코드를 쓰십시오.[예1]:
#include
#include
int main() {
printf("sbrk(0) = %p
", sbrk(0)); // x
printf("sbrk(0) = %p
", sbrk(0)); // x
printf("sbrk(5) = %p
", sbrk(5)); // x
printf("sbrk(0) = %p
", sbrk(0)); // x + 5
return 0;
}
다음과 같은 결과가 예상됩니다.
sbrk(0) = 0x1985000
sbrk(0) = 0x1985000
sbrk(5) = 0x1985000
sbrk(0) = 0x1985005
그러나 출력은 다음과 같습니다.
sbrk(0) = 0x1985000
sbrk(0) = 0x19a6000
sbrk(5) = 0x19a6000
sbrk(0) = 0x19a6005
다른 방법으로 주소를 변수에 저장합니다. [예 2]:
#include
#include
int main() {
void *toto1 = sbrk(0);
void *toto2 = sbrk(0);
void *toto3 = sbrk(5);
void *toto4 = sbrk(0);
printf("sbrk(0) = %p
", toto1);
printf("sbrk(0) = %p
", toto2);
printf("sbrk(5) = %p
", toto3);
printf("sbrk(0) = %p
", toto4);
}
결과 출력:
sbrk(0) = 0x617000
sbrk(0) = 0x617000
sbrk(5) = 0x617000
sbrk(0) = 0x617005
이것이야말로 우리가 예상한 것과 같다. 그런데 왜 이런 상황이 발생했을까?
사실 이 문제가 발생한 원인은 printf의 냄비입니다!
sbrk(0)
에서 같은 값을 되돌려 주지 않았습니까?처음 호출printf
함수를 호출했을 때 내부에 버퍼stdout
를 할당했고 버퍼를 만들 때 malloc
를 호출했으며 malloc
내부에 brk
를 할당했다.printf
되었습니까?기본적으로 stdout
는 줄 버퍼이고 버퍼는 처음 인쇄할 때 필요에 따라 만들어지며, 다음에 몇 번 호출되었든 printf
버퍼가 만들어졌기 때문이다.sbrk
는 printf
이전에 호출되기 때문에 다른 함수malloc
는 공간을 분배한 후에 진행되며 출력 결과에 영향을 주지 않는다.참고 자료: Why does calling sbrk(0) twice give a different value?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.