2014-10-10 3 views
1

Какую часть этой цитаты из man-страницы getcwd я недопонимаю?нестандартный/не-POSIX getcwd(), не вызывающий malloc

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); 

вызывает SEG-Fault в строке 24 и трассировку GdB рассказывает мне буфер = 0x0?

EDIT:

getcwd(buffer, bufferSize); 

все еще не работает по какой-либо причине, но

buffer = getcwd(NULL, 0); 

делает

ответ

1

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

getcwd(buffer, bufferSize); 

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

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

+0

AAAAAAAAAAAAAAAAAHHHHHHH, да, вы правы, вот почему getline и getdelim принимают char ** buffer ... – Kdawg

+0

@Kdawg Точно. Если вы считаете, что этот ответ был полезен, следующим шагом будет щелкнуть стрелку вверх и/или галочку ниже, чтобы «принять» ответ. – Jens

+0

извините, мой человек, «Vote Up требует 15 репутации» ... однажды я доберусь туда – Kdawg

0

Оно должно быть:

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

с %s принимает char*, а не char.

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

+0

У меня это как printf («% s \ n», буфер); теперь, но ничего не изменилось и errno = 0? – Kdawg

+0

Это изделие не работает. 'buffer' может быть только' NULL'. – Jens

 Смежные вопросы

  • Нет связанных вопросов^_^