Нестандартный / не POSIX getcwd() не вызывает malloc

Какую часть этой цитаты с man-страницы getcwd я неправильно понял?

   char *getcwd(char *buf, size_t size);
   ...
   As  an  extension  to  the  POSIX.1-2001 standard, Linux (libc4, libc5,
   glibc) getcwd() allocates the buffer dynamically using malloc(3) if buf
   is NULL.  In this case, the allocated buffer has the length size unless
   size is zero, when buf is allocated as big as  necessary.   The  caller
   should free(3) the returned buffer.

так как

 21         char * buffer = NULL;
 22         size_t bufferSize = 0;
 23         getcwd(buffer, bufferSize);
 24         printf("%s\n", buffer);

вызывает ошибку сегмента в строке 24 и обратная трассировка GDB говорит мне буфер = 0x0?

РЕДАКТИРОВАТЬ:

 getcwd(buffer, bufferSize);

до сих пор не работает по любой причине, но

 buffer = getcwd(NULL, 0);

делает

2 ответа

Решение

Вы упускаете, что C имеет только колл по значению; не звоните по ссылке:

getcwd(buffer, bufferSize);

НЕ могу изменить указатель buffer (только что buffer указывает на, но так как это NULL...). Вот почему вам нужно использовать значение, возвращаемое (это нестандартная версия) getcwd,

Вы также пропустили чтение раздела "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" этой справочной страницы или неверно истолковали цитируемую часть, в которой говорится, что вызывающая сторона должна освободить (3) возвращенный буфер.:-)

Так должно быть:

 printf("%s\n", buffer);

поскольку %s занимает char*не char,

Вы бы знали об этом, если бы у вас были предупреждения.

Другие вопросы по тегам