почему аргумент функции brk () имеет тип void *, а не тип int? - PullRequest
0 голосов
/ 11 января 2020

Я смотрел документацию по функции int brk () в руководстве Linux:

SYNOPSIS
   #include <unistd.h>

   int brk(void *addr);

   void *sbrk(intptr_t increment);



Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

   brk(), sbrk():
       Since glibc 2.19:
           _DEFAULT_SOURCE ||
               (_XOPEN_SOURCE >= 500) &&
               ! (_POSIX_C_SOURCE >= 200112L)
       From glibc 2.12 to 2.19:
           _BSD_SOURCE || _SVID_SOURCE ||
               (_XOPEN_SOURCE >= 500) &&
               ! (_POSIX_C_SOURCE >= 200112L)
       Before glibc 2.12:
           _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500

DESCRIPTION      
       brk() and sbrk() change the location of the program break, which
       defines the end of the process's data segment (i.e., the program
       break is the first location after the end of the uninitialized data
       segment).  Increasing the program break has the effect of allocating
       memory to the process; decreasing the break deallocates memory.

   brk() sets the end of the data segment to the value specified by
   addr, when that value is reasonable, the system has enough memory,
   and the process does not exceed its maximum data size (see
   setrlimit(2)).

RETURN VALUE    
       On success, brk() returns zero.  On error, -1 is returned, and errno
       is set to ENOMEM.

, и я кое-что не понимаю: если brk () устанавливает только конец сегмент данных к значению, указанному в addr, тогда почему аргумент void *, а не тип int?

Спасибо за помощь!

1 Ответ

1 голос
/ 11 января 2020

Полагаю, поскольку "break - это адрес первого местоположения за текущим концом области данных" (Википедия), вы не можете и не должны знать, какие данные там находятся, и, следовательно, указатель не может быть любого другого типа чем недействительным.

...