一、路径名
很多程序需要为路径名分配存储器,一般来说,在编译时就为其分配了存储器,而且使用了各种幻数(其中很少是正确的)作为数组长度:256,512或1024或标准I/O常数BUFSIZE.
如若在< limits.h>中定义了常数PATHMAX,那么就没有任何问题,如果没有,则需调用pathconf。因为pathconf的返回值是把第一个参数视为基于工作目录的相对路径名。所以指定根为第一个参数,并将得到的返回值加1作为结果值。如果pathconf指明PATHMAX是不确定的,那么我们就只得猜测某个值。调用malloc时的+ 1是为了在尾端加null字符。处理不确定结果情况的正确方法与如何使用分配到的存储空间有关。例如,如果我们为getcwd调用分配空间(返回当前工作目录的绝对路径名),而分配到的空间太小,则返回一个出错,errno设置为ERANGE。然后可调用realloc以增加分配空间并再试。不断重复此操作,直到getcwd调用成功执行。
下面是一个路径动态分配存储器的实现:
#include
#include
#include
#include
#include
#include
#ifdef PATH_MAX
static int pathmax = PATH_MAX;
#else
static int pathmax = 0;
#endif
#define PATH_MAX_GUESS 1024
//为路径名动态分配空间
char * path_alloc(int *size)
{
char *ptr;
//如果在中定义了常数PATH_MAX,那么就没有问题,如果没有,则需调用pathconf
if(pathmax == 0){
errno = 0;
if((pathmax = pathconf("/",_PC_PATH_MAX)) < 0){
if(errno == 0)//如果pathconf指明PATH_MAX是不确定的,那么我们就只能猜测某个值
pathmax = PATH_MAX_GUESS;
else{
perror("pathconf error for _PC_PATH_MAX");
}
}else
pathmax++;
}
//调用malloc加1是为了在尾端加null字符。
if((ptr = malloc(pathmax + 1)) == NULL){
perror("malloc error for pathname");
exit(1);
}
if(size != NULL)
*size = pathmax + 1;
return ptr;
}
int main()
{
int *size;
char *ptr = path_alloc(size);
printf("size : %d\n",*size);
exit(0);
}
阅读(1670) | 评论(0) | 转发(0) |