왜 sbrk(0)를 두 번 호출하면 다른 값을 얻을 수 있습니까?

2233 단어
함수sbrk()를 공부할 때 우리는 다음과 같이 알고 있다.
void *sbrk (intptr_t increment);
  • increment가 정시일 때increment의 크기에 따라 메모리 공간을 열고 개척 전 프로그램 중단점(program break)의 주소를 되돌려줍니다.
  • increment가 마이너스일 때increment의 크기에 따라 메모리 공간을 방출하고 방출 전 프로그램 중단점의 주소를 되돌려줍니다.
  • increment가 0일 때 공간을 분배하거나 방출하지 않고 현재 프로그램 중단점의 주소를 되돌려줍니다.

  • 그러면 테스트 코드를 쓰십시오.[예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의 냄비입니다!
  • [예1]의 코드는 왜 두 번 호출sbrk(0)에서 같은 값을 되돌려 주지 않았습니까?처음 호출printf 함수를 호출했을 때 내부에 버퍼stdout를 할당했고 버퍼를 만들 때 malloc를 호출했으며 malloc 내부에 brk를 할당했다.
  • [예1]의 코드는 왜 뒤에 여러 번 호출printf되었습니까?기본적으로 stdout는 줄 버퍼이고 버퍼는 처음 인쇄할 때 필요에 따라 만들어지며, 다음에 몇 번 호출되었든 printf 버퍼가 만들어졌기 때문이다.
  • [예2]의 코드는 왜 출력이 정확합니까?sbrkprintf 이전에 호출되기 때문에 다른 함수malloc는 공간을 분배한 후에 진행되며 출력 결과에 영향을 주지 않는다.

  • 참고 자료: Why does calling sbrk(0) twice give a different value?

    좋은 웹페이지 즐겨찾기