调用malloc,未知大小

时间:2011-03-10 09:09:19

标签: c

我使用_getcwd获取当前工作目录。该函数需要一个指向缓冲区的指针和缓冲区大小。

在我使用的代码中:

char *cwdBuf;
cwdBuf = malloc(100);

我不知道所需缓冲区的大小,所以我保留的内存方式比需要大。我想做的是使用正确的内存量。

有没有办法做到这一点?

4 个答案:

答案 0 :(得分:4)

您的目标平台是什么? getcwd() documentation here提出了两个要点:

  

作为POSIX.1-2001标准的扩展,Linux(libc4,libc5,glibc) getcwd()使用malloc()动态分配缓冲区,如果buf在调用时为NULL 。在这种情况下,分配的缓冲区具有长度大小,除非size为零,当buf根据需要分配时。如果已经以这种方式获得缓冲区,则可以(并且实际上是可取的)释放()缓冲区...

     

... buf参数应该是指向至少PATH_MAX字节长的数组的指针。 getwd()只返回实际路径名的第一个PATH_MAX字节。

答案 1 :(得分:1)

通常会定义一个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,它会为你分配一个缓冲区。

答案 2 :(得分:1)

当前工作目录的大小未知,但可以要求其上限。

分配用于getcwd()的内存的正确方法是在分配缓冲区并调用{{}之前,通过pathconf(".", _PC_PATH_MAX); 查询系统所需的最大长度缓冲区。 1}}。

OpenGroup UNIX标准联机帮助页在给出的示例代码中记录了此for getcwd()。引用:

getcwd()

答案 3 :(得分:0)

一旦知道结果的大小,realloc()怎么样?