Звоните в malloc, неизвестного размера - PullRequest
2 голосов
/ 10 марта 2011

Я получаю текущий рабочий каталог с _getcwd. Функция требует указатель на буфер и размер буфера.

В моем коде я использую:

char *cwdBuf;
cwdBuf = malloc(100);

Я не знаю, какой размер буфера нужен, поэтому я резервирую память до того размера, который необходим То, что я хотел бы сделать, это использовать правильный объем памяти.

Есть ли способ сделать это?

Ответы [ 4 ]

4 голосов
/ 10 марта 2011

Какая у вас целевая платформа? getcwd() документация здесь подчеркивает два важных момента:

В качестве расширения стандарта POSIX.1-2001 Linux (libc4, libc5, glibc) getcwd () динамически распределяет буфер с помощью malloc (), если buf равен NULL при вызове . В этом случае выделенный буфер имеет размер длины, если размер не равен нулю, когда buf выделяется настолько большим, насколько это необходимо. Можно (и действительно желательно) освободить () буферы, если они были получены таким образом ...

... Аргумент buf должен быть указателем на массив длиной не менее PATH_MAX. getwd () возвращает только первые байты PATH_MAX фактического пути.

1 голос
/ 10 марта 2011

Размер текущего рабочего каталога неизвестен как таковой, но можно запросить его верхний предел.

Правильный способ выделения памяти для использования для getcwd() заключается в запросе системы на требуемый максимальный размер буфера, через pathconf(".", _PC_PATH_MAX); перед выделением буфера и вызовом getcwd().

Стандартные man-страницы OpenGroup UNIX документируют это для getcwd() в приведенном примере кода. Цитата:

#include <stdlib.h>
#include <unistd.h>
...
long size;
char *buf;
char *ptr;

size = pathconf(".", _PC_PATH_MAX);

if ((buf = (char *)malloc((size_t)size)) != NULL)
    ptr = getcwd(buf, (size_t)size);
...
1 голос
/ 10 марта 2011

Обычно определяется макрос MAX_PATH, который вы можете использовать.Кроме того, есть ли причина не просто размещать в стеке?

Редактировать:

Из документов MSDN:

#include <direct.h>
#include <stdlib.h>
#include <stdio.h>

int main( void )
{
   char* buffer;

   // Get the current working directory: 
   if( (buffer = _getcwd( NULL, 0 )) == NULL )
      perror( "_getcwd error" );
   else
   {
      printf( "%s \nLength: %d\n", buffer, strnlen(buffer) );
      free(buffer);
   }
}

Таким образом, похоже, что вы передаете NULL, он выделяет для вас буфер.

0 голосов
/ 10 марта 2011

Как насчет realloc(), когда вы узнаете размер результата?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...