关于path_alloc函数(APUE)

本文详细解析了在APUE中出现的path_alloc函数,提供了两种实现方式,一种遵循APUE老版本,另一种则简化定义,确保程序正常运行。
      今天看书时,看到了path_alloc这个函数,但是不知道在哪定义的,也不知道啥功能,在LINUX C函数库里也没有找到,于是就百度了一下,发现了一篇不错的解释,以下是转载自风玲海淼的百度空间的一篇帖子,链接为 http://hi.baidu.com/c_program/blog/item/604cb4ad1845cf0a4a36d603.html
 
在APUE的某些版本中,在例子4-7和4-9中用到的函数path_alloc()函数,许多人直接把例题输入后发现并不能编译,这是由于path_alloc()函数的原因,因此,我们需要将这个函数补齐。
我从网上查了一下,其中有好多的答案是从apue的老版本中的解决方法,如下:
Figure 2.15. Dynamically allocate space for a pathname

#include "apue.h"
#include <errno.h>
#include <limits.h>
#ifdef   PATH_MAX
static int   pathmax = PATH_MAX;
#else
static int   pathmax = 0;
#endif
#define SUSV3 200112L
static long posix_version = 0;
/* If PATH_MAX is indeterminate, no guarantee this is adequate */
#define PATH_MAX_GUESS   1024
char *
path_alloc(int *sizep) /* also return allocated size, if nonnull */
{
char *ptr;
int size;
if (posix_version == 0)
       posix_version = sysconf(_SC_VERSION);
if (pathmax == 0) {     /* first time through */
       errno = 0;
       if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0) {
         if (errno == 0)
            pathmax = PATH_MAX_GUESS; /* it's indeterminate */
         else
            err_sys("pathconf error for _PC_PATH_MAX");
       } else {
         pathmax++;    /* add one since it's relative to root */
       }
}
if (posix_version < SUSV3)
       size = pathmax + 1;
else
       size = pathmax;
if ((ptr = malloc(size)) == NULL)
       err_sys("malloc error for pathname");
if (sizep != NULL)
       *sizep = size;
return(ptr);
}

另外,还发现一个简单的解决方法,当然,这个解决方法只是简单的定义path_alloc()这个函数,但是,可以使我们的程序正常的运行...
char*path_alloc(int* size)
{
char *p = NULL;
if(!size) return NULL;
p = malloc(256);
if(p)
*size = 256;
else
*size = 0;
return p;
}

转载于:https://www.cnblogs.com/xiaoliyu/archive/2009/03/08/1406448.html

<think>嗯,用户正在寻找关于C/C++中的_init_alloc函数的定义、实现和用法。首先,我需要确认这个函数是否属于标准库的一部分。根据我的知识库,C和C++标准库中没有名为_init_alloc函数。常见的与内存分配相关的函数通常是malloc、calloc、realloc和free,而C++中还有new和delete操作符,以及allocator类。 接下来,我需要考虑用户提到的引用内容。他们提供的引用提到了FFmpeg中的av_packet_alloc、av_packet_free和av_new_packet函数,以及STL中的unordered_set的用法。这些引用可能让用户误以为_init_alloc是某个库中的函数,比如FFmpeg或其他第三方库。或者,用户可能在代码中看到了类似_init_alloc的命名,但拼写有误,比如可能是init_alloc或_alloc_init之类的。 我需要进一步分析可能的拼写错误或相关函数。例如,在FFmpeg中,存在av_init_packet函数,用于初始化AVPacket结构体。用户可能将av_init_packet和av_packet_alloc混淆,导致误写成_init_alloc。此外,在STL的allocator中,可能有类似initialize或allocate的函数,但名字不完全匹配。 另外,用户可能指的是自定义的_init_alloc函数,比如某个项目或框架中自行实现的函数。这时候,我需要建议用户检查他们的代码库或文档,或者提供更多上下文信息。例如,某些嵌入式系统或特定框架可能会有自定义的内存管理函数。 还需要考虑C++中的分配器(allocator)概念。标准库中的allocator通常有construct、destroy、allocate和deallocate等方法,但没有_init_alloc。但用户可能将初始化与分配结合,误以为有这样的函数。 总结来说,用户可能混淆了函数名称,或者指的是特定库中的非标准函数。因此,我的回答需要指出标准库中没有该函数,并提供可能的替代或相关函数,如av_packet_alloc或自定义分配器的示例。同时,建议用户检查拼写或上下文,以准确找到所需信息。</think>根据现有技术资料分析,C/C++标准库中不存在名为`_init_alloc`的内置函数。该名称可能是开发者自定义函数或第三方库中的实现。以下是基于内存管理和FFmpeg引用的分析: 1. **标准库对比分析** - 标准内存分配函数:$malloc()$, $calloc()$, $realloc()$ - C++ allocator类:$std::allocator<T>::allocate()$ - 引用[1][2]中FFmpeg的`av_packet_alloc`通过`packet_alloc`实现内存分配[^1][^2] 2. **可能关联实现分析** 若为自定义内存分配器,可能包含以下典型结构: ```cpp // 自定义内存分配器初始化示例 struct MyAllocator { void* _init_alloc(size_t size) { void* ptr = ::operator new(size); if (!ptr) throw std::bad_alloc(); return ptr; } }; ``` 3. **FFmpeg相关实现参考** 引用[2]中的`av_new_packet`演示了内存分配与初始化结合的过程: ```cpp int av_new_packet(AVPacket *pkt, int size) { AVBufferRef *buf = NULL; int ret = packet_alloc(&buf, size); // 类似分配器功能 // ...初始化操作... } ``` 此处的`packet_alloc`与`_init_alloc`功能相似[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值