我使用_getcwd获取当前工作目录。该函数需要一个指向缓冲区的指针和缓冲区大小。
在我使用的代码中:
char *cwdBuf;
cwdBuf = malloc(100);
我不知道所需缓冲区的大小,所以我保留的内存方式比需要大。我想做的是使用正确的内存量。
有没有办法做到这一点?
答案 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()
怎么样?