Нестандартный / не 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
,
Вы бы знали об этом, если бы у вас были предупреждения.