模块契约FixedStack、PtrFixedStack、Stack、BlockStack 与 PtrStack
错误与原子性
| 场景 | 错误种类 |
|---|
| 空结构、空来源、零元素大小或无效外部缓冲 | XERR_ARGUMENT |
| 公开结构摘要损坏 | XERR_STATE |
| 空栈访问、尺寸乘法或容量取整溢出 | XERR_RANGE |
| 固定栈容量已满 | XERR_AGAIN |
| 创建、预留、连续扩容或新块分配失败 | XERR_MEMORY |
所有失败操作都保持原有深度和已有元素。BlockStack 的 Reserve 还保证失败时不保留部分数据块。成功和正常状态查询不会主动清除调用前已有错误。
裁剪与依赖
| 能力 | 宏 | 依赖 |
|---|
| 固定容量栈 | XRT_FEATURE_FIXED_STACK | core |
| 固定容量指针栈 | XRT_FEATURE_PTR_FIXED_STACK | fixed_stack |
| 动态栈 | XRT_FEATURE_STACK | array |
| 稳定地址分块栈 | XRT_FEATURE_BLOCK_STACK | array |
| 指针栈 | XRT_FEATURE_PTR_STACK | stack |
固定栈不依赖动态数组。只需要本地有界工作栈时,不会带入任何扩容代码。 BlockStack 与连续 Stack 可分别裁剪;两者都只复用 Array 的块索引或连续存储底座。 启用 ptr_stack 必须同时启用 stack 和 array,公共头会拒绝所有不完整依赖。
共同契约
- 栈顶是最后压入的元素,
Push、Top、Pop 均为 O(1) 摊销操作;固定栈始终为 O(1)。 Push 浅复制一个完整元素;Add 返回未初始化新槽,调用方必须立即写满。Get(index) 使用统一的 0 基栈底索引;Peek(depth) 从栈顶计数,depth == 0 等价于 Top。Top、Get 和 Peek 返回栈内借用地址。FixedStack 地址在生命周期内稳定;连续 Stack 扩容可能移动全部元素;BlockStack 的活动元素在 Push、Pop 和 Reserve 后仍保持地址稳定。Pop 把值复制到外部缓冲后再删除,不返回失活槽地址。输出可以为 NULL,表示只删除栈顶;输出不得与同一栈的存储区重叠。FixedStack 和连续 Stack 会主动检查这一条件;BlockStack 的低成本前置条件见其专节。- 容器只管理元素字节。结构体中的指针、句柄和其他资源仍由调用方管理。
- 空栈
Top 或 Pop 返回失败并设置 XERR_RANGE。固定栈已满时 Add 或 Push 设置 XERR_AGAIN,且原栈不变。 - 容器不隐式加锁。一个栈同时只能由一个执行流修改;跨线程共享时使用外部同步。
PtrFixedStack
Init 直接借用调用方的 ptr[],容量参数使用元素数量而不是字节数。指针数组不得与栈结构本身重叠。整个生命周期可以完全不分配内存,适合固定上限的资源回滚、清理动作和句柄栈。Create 则复用 FixedStack 的拥有型固定缓冲。
PtrFixedStack 只保存指针值,不拥有目标。它允许保存合法 NULL; 此时 Get、Peek 或 Top 返回 NULL 且不设置新错误,空栈或越界则设置 XERR_RANGE。 需要区分合法空值与失败时,应在读取前清除旧错误,再检查本次调用后的错误状态; 已知索引小于公开 Count 时,返回的 NULL 就是合法值。 所有入口都会拒绝元素宽度不是 sizeof(ptr) 的 FixedStack, 避免旧版“在更宽结构体前几个字节写入指针”的隐式布局。
PtrStack
指针栈允许保存合法 NULL。此时 Top 返回 NULL 但不会设置新错误; 空栈也返回 NULL,同时设置 XERR_RANGE。 需要无歧义处理时,在调用前清除错误并检查 xrtGetError(),或直接使用 Count。
Pop 返回布尔结果,因此能无歧义弹出空指针。输出参数可以为空,表示丢弃栈顶。清空、弹出和销毁都不会释放指针目标。 类型化入口会检查底层连续栈确实使用 sizeof(ptr) 元素,并直接复用已验证的 Array 增长原语;因此 Push 不需要通用字节复制和来源别名分析。分配失败保持 地址、深度、容量和已有指针值不变。Pop 继续复用通用栈的输出别名检查, 若输出指向自身存储区则设置 XERR_ARGUMENT 且不删除栈顶。
xfixedstack类型
固定栈可借用外部缓冲,也可拥有创建时分配的固定缓冲。
| 字段 | 类型 | 语义 |
|---|
Data | bytes | 数据 |
Allocation | ptr | Allocation |
ItemSize | size_t | 单元素字节数 |
Count | size_t | 数量 |
Capacity | size_t | 容量 |
typedef struct xfixedstack { bytes Data; ptr Allocation; size_t ItemSize; size_t Count; size_t Capacity; } xfixedstack;
xblockstack类型
* 分块栈只移动块索引,不移动块内元素。 * Blocks 的元素类型属于内部实现,调用方只能读取其 Count 和 Capacity 做诊断。
| 字段 | 类型 | 语义 |
|---|
Blocks | xarray | Blocks |
ItemSize | size_t | 单元素字节数 |
Count | size_t | 数量 |
Capacity | size_t | 容量 |
BlockItems | size_t | BlockItems |
Alignment | size_t | 对齐(二次幂) |
typedef struct xblockstack { xarray Blocks; size_t ItemSize; size_t Count; size_t Capacity; size_t BlockItems; size_t Alignment; } xblockstack;
xptrfixedstack类型
固定指针栈只保存指针值,不拥有指针指向的对象。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
typedef xfixedstack xptrfixedstack;
xstack类型
动态栈复用连续数组存储,结构性修改可能改变元素地址。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
typedef xarray xstack;
xptrstack类型
指针栈只保存指针值,不拥有指针指向的对象。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
typedef xstack xptrstack;
LIFO 操作
xrtFixedStackInit函数
在不与栈结构重叠的调用方缓冲上初始化固定容量栈。
bool xrtFixedStackInit(xfixedstack* pStack, ptr pMemory, size_t iMemorySize, size_t iItemSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输出 | 非空 | 接收栈 |
pMemory | 输入 | 非空、不与栈重叠 | 元素缓冲 |
iMemorySize | 输入 | 足够容纳容量 | 缓冲字节数 |
iItemSize | 输入 | > 0 | 元素字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已初始化 | — |
false | 布局参数非法 | XERR_ARGUMENT / XERR_RANGE |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 缓冲尺寸与元素大小不匹配
范例已编译验证
fixed · 外部缓冲初始化
if ( !xrtFixedStackInit(&tFrames, pStorage, sizeof(pStorage), sizeof(exampleframe)) ) {
xrtFixedStackCreate函数
创建拥有固定容量缓冲的栈。
xfixedstack* xrtFixedStackCreate(size_t iCapacity, size_t iItemSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iCapacity | 输入 | > 0 | 元素容量 |
iItemSize | 输入 | > 0 | 元素字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 栈(含缓冲) | — |
NULL | 创建失败 | XERR_ARGUMENT / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 堆创建
xfixedstack* pFixed = xrtFixedStackCreate(4u, sizeof(int));
xrtFixedStackUnit函数
释放创建时取得的固定缓冲,但不释放栈结构。
void xrtFixedStackUnit(xfixedstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
fixed · 释放缓冲
xrtFixedStackUnit(&tFrames);
xrtFixedStackDestroy函数
释放固定缓冲和创建的栈结构。
void xrtFixedStackDestroy(xfixedstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
tour · 销毁
xrtFixedStackDestroy(pFixed);
xrtFixedStackClear函数
清空栈内容并保留固定容量。
void xrtFixedStackClear(xfixedstack* pStack)
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
范例已编译验证
tour · 清空
xrtFixedStackClear(pFixed);
xrtFixedStackSpace函数
返回剩余可压入元素数量。
size_t xrtFixedStackSpace(const xfixedstack* pStack)
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
范例已编译验证
tour · 剩余容量
iSpace = xrtFixedStackSpace(pFixed);
xrtFixedStackGet函数
返回指定 0 基位置的可写元素借用地址。
ptr xrtFixedStackGet(xfixedstack* pStack, size_t iIndex)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iIndex | 输入 | < 深度 | 0 基位置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 按位取写
(void)xrtFixedStackGet(pFixed, 0u);
xrtFixedStackConstGet函数
返回指定 0 基位置的只读元素借用地址。
const void* xrtFixedStackConstGet(const xfixedstack* pStack, size_t iIndex)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iIndex | 输入 | < 深度 | 0 基位置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 按位取读
(void)xrtFixedStackConstGet(pFixed, 0u);
xrtFixedStackAdd函数
取得一个未初始化栈顶槽,栈满时失败。
ptr xrtFixedStackAdd(xfixedstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 未初始化栈顶槽 | — |
NULL | 栈满或参数非法 | XERR_AGAIN / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_AGAIN — 固定容量已满
范例已编译验证
tour · 取得栈顶槽
pSlot = (int*)xrtFixedStackAdd(pFixed);
xrtFixedStackPush函数
复制一个元素压入固定栈。
bool xrtFixedStackPush(xfixedstack* pStack, const void* pItem)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pItem | 输入 | 非空 | 要压入的元素 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已压入 | — |
false | 栈满或参数非法 | XERR_AGAIN / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_AGAIN — 固定容量已满
范例已编译验证
fixed · 复制压入
if ( !xrtFixedStackPush(&tFrames, &pInput[i]) ) {
xrtFixedStackPop函数
弹出栈顶元素,并可把内容复制到外部输出缓冲。
bool xrtFixedStackPop(xfixedstack* pStack, ptr pItem)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pItem | 输出 | 允许空;不与栈重叠 | 接收弹出的元素 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已弹出 | — |
false | 栈空或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
fixed · 弹出
while ( xrtFixedStackPop(&tFrames, &tFrame) ) {
xrtFixedStackPeek函数
返回距栈顶指定深度的可写元素,深度 0 表示栈顶。
ptr xrtFixedStackPeek(xfixedstack* pStack, size_t iDepth)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iDepth | 输入 | < 深度 | 距栈顶深度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 深度取写
(void)xrtFixedStackPeek(pFixed, 0u);
xrtFixedStackConstPeek函数
返回距栈顶指定深度的只读元素,深度 0 表示栈顶。
const void* xrtFixedStackConstPeek(const xfixedstack* pStack, size_t iDepth)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iDepth | 输入 | < 深度 | 距栈顶深度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 深度取读
const int* pPeek = (const int*)xrtFixedStackConstPeek(pFixed, 1u);
xrtFixedStackTop函数
返回可写栈顶元素借用地址。
ptr xrtFixedStackTop(xfixedstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
tour · 栈顶写
int* pTop = (int*)xrtFixedStackTop(pFixed);
xrtFixedStackConstTop函数
返回只读栈顶元素借用地址。
const void* xrtFixedStackConstTop(const xfixedstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
tour · 栈顶读
(void)xrtFixedStackConstTop(pFixed);
PtrFixedStack
xrtPtrFixedStackInit函数
在不与栈结构重叠的调用方指针数组上初始化固定容量指针栈。
bool xrtPtrFixedStackInit(xptrfixedstack* pStack, ptr* pMemory, size_t iCapacity)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输出 | 非空 | 接收栈 |
pMemory | 输入 | 非空 | 指针槽数组 |
iCapacity | 输入 | > 0 | 槽数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已初始化 | — |
false | 参数非法或溢出 | XERR_ARGUMENT / XERR_RANGE |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量尺寸溢出
范例已编译验证
pfixed · 外部数组初始化
if ( !xrtPtrFixedStackInit(&tCleanup, pStorage, 4) ) {
xrtPtrFixedStackCreate函数
创建拥有指定固定容量的指针栈。
xptrfixedstack* xrtPtrFixedStackCreate(size_t iCapacity)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 指针栈 | — |
NULL | 创建失败 | XERR_ARGUMENT / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 堆创建
xptrfixedstack* pPtr = xrtPtrFixedStackCreate(4u);
xrtPtrFixedStackUnit函数
释放拥有的指针存储区,但不释放任何指针目标或栈结构。
void xrtPtrFixedStackUnit(xptrfixedstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
pfixed · 释放存储
xrtPtrFixedStackUnit(&tCleanup);
xrtPtrFixedStackDestroy函数
释放创建的指针栈结构,但不释放任何指针目标。
void xrtPtrFixedStackDestroy(xptrfixedstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
tour · 销毁
xrtPtrFixedStackDestroy(pPtr);
xrtPtrFixedStackClear函数
清空固定指针栈,但不释放任何指针目标。
void xrtPtrFixedStackClear(xptrfixedstack* pStack)
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
范例已编译验证
tour · 清空
xrtPtrFixedStackClear(pPtr);
xrtPtrFixedStackSpace函数
返回固定指针栈剩余容量。
size_t xrtPtrFixedStackSpace(const xptrfixedstack* pStack)
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
范例已编译验证
tour · 剩余容量
printf("ptrfixed: space=%zu", xrtPtrFixedStackSpace(pPtr));
xrtPtrFixedStackGet函数
返回指定 0 基位置的指针值。
ptr xrtPtrFixedStackGet(const xptrfixedstack* pStack, size_t iIndex)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iIndex | 输入 | < 深度 | 0 基位置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 指针值 | 存储的值(可为空值) | — |
NULL | 越界 | XERR_RANGE |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 按位取值
(void)xrtPtrFixedStackGet(pPtr, 0u);
xrtPtrFixedStackPush函数
压入一个可为空的指针值。
bool xrtPtrFixedStackPush(xptrfixedstack* pStack, ptr pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pValue | 输入 | 任意值 | 要压入的指针 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已压入 | — |
false | 栈满或参数非法 | XERR_AGAIN / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_AGAIN — 固定容量已满
范例已编译验证
pfixed · 压入
if ( !xrtPtrFixedStackPush(&tCleanup, &pResources[i]) ) {
xrtPtrFixedStackPop函数
弹出指针值;输出为空表示只删除栈顶。
bool xrtPtrFixedStackPop(xptrfixedstack* pStack, ptr* pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pValue | 输出 | 允许空 | 接收弹出的值 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已弹出 | — |
false | 栈空或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
pfixed · 弹出
while ( xrtPtrFixedStackPop(&tCleanup, &pResource) ) {
xrtPtrFixedStackPeek函数
返回距栈顶指定深度的指针值,深度 0 表示栈顶。
ptr xrtPtrFixedStackPeek(const xptrfixedstack* pStack, size_t iDepth)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iDepth | 输入 | < 深度 | 距栈顶深度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 指针值 | 存储的值(可为空值) | — |
NULL | 越界 | XERR_RANGE |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 深度取值
(void)xrtPtrFixedStackPeek(pPtr, 0u);
xrtPtrFixedStackTop函数
返回栈顶指针值;合法空值与错误通过错误状态区分。
ptr xrtPtrFixedStackTop(const xptrfixedstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 指针值 | 栈顶值(可为合法空值) | — |
NULL | 栈空 | XERR_RANGE |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
tour · 栈顶值
(void)xrtPtrFixedStackTop(pPtr);
LIFO 操作
xrtStackInit函数
初始化使用默认对齐的空动态栈。
bool xrtStackInit(xstack* pStack, size_t iItemSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输出 | 非空 | 接收栈 |
iItemSize | 输入 | > 0 | 元素字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已初始化 | — |
false | 布局参数非法 | 见错误 |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量或尺寸计算溢出XERR_VALUE — 对齐不是二次幂XERR_MEMORY — 缓冲分配失败
范例已编译验证
cstack · 默认初始化
if ( !xrtStackInit(&tValues, sizeof(int)) ) {
xrtStackInitAligned函数
初始化显式过对齐动态栈。
bool xrtStackInitAligned(xstack* pStack, size_t iItemSize, size_t iAlignment)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输出 | 非空 | 接收栈 |
iItemSize | 输入 | > 0 | 元素字节数 |
iAlignment | 输入 | 二次幂 | 元素对齐 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已初始化 | — |
false | 布局参数非法 | 见错误 |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量或尺寸计算溢出XERR_VALUE — 对齐不是二次幂XERR_MEMORY — 缓冲分配失败
范例已编译验证
tour · 对齐初始化
if ( !xrtStackInitAligned(&Aligned, sizeof(int), 4u) ) {
xrtStackCreate函数
创建使用默认对齐的空动态栈。
xstack* xrtStackCreate(size_t iItemSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iItemSize | 输入 | > 0 | 元素字节数 |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量或尺寸计算溢出XERR_VALUE — 对齐不是二次幂XERR_MEMORY — 缓冲分配失败
范例已编译验证
tour · 堆创建
xstack* pStack = xrtStackCreate(sizeof(int));
xrtStackCreateAligned函数
创建显式过对齐动态栈。
xstack* xrtStackCreateAligned(size_t iItemSize, size_t iAlignment)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iItemSize | 输入 | > 0 | 元素字节数 |
iAlignment | 输入 | 二次幂 | 元素对齐 |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量或尺寸计算溢出XERR_VALUE — 对齐不是二次幂XERR_MEMORY — 缓冲分配失败
范例已编译验证
tour · 堆创建(对齐)
xrtStackDestroy(xrtStackCreateAligned(sizeof(int), 4u));
xrtStackUnit函数
释放动态栈元素内存,但不释放栈结构。
void xrtStackUnit(xstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
cstack · 释放元素内存
xrtStackUnit(&tValues);
xrtStackDestroy函数
释放动态栈全部资源和栈结构。
void xrtStackDestroy(xstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
tour · 销毁
xrtStackDestroy(pStack);
xrtStackClear函数
清空动态栈并保留容量。
void xrtStackClear(xstack* pStack)
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
范例已编译验证
tour · 清空
(void)xrtStackClear(pStack);
xrtStackReserve函数
保证动态栈至少具有指定元素容量。
bool xrtStackReserve(xstack* pStack, size_t iCapacity)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
iCapacity | 输入 | — | 期望容量 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 容量已保证 | — |
false | 扩容失败 | XERR_RANGE / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量溢出XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 预留容量
(void)xrtStackReserve(pStack, 32u);
xrtStackTrim函数
将动态栈容量裁剪到当前深度。
bool xrtStackTrim(xstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已裁剪(或无需裁剪) | — |
false | 裁剪失败 | XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 裁剪容量
(void)xrtStackTrim(pStack);
xrtStackGet函数
返回指定 0 基位置的可写元素借用地址。
ptr xrtStackGet(xstack* pStack, size_t iIndex)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iIndex | 输入 | < 深度 | 0 基位置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 按位取写
(void)xrtStackGet(pStack, 0u);
xrtStackConstGet函数
返回指定 0 基位置的只读元素借用地址。
const void* xrtStackConstGet(const xstack* pStack, size_t iIndex)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iIndex | 输入 | < 深度 | 0 基位置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 按位取读
const int* pGet = (const int*)xrtStackConstGet(pStack, 0u);
xrtStackAdd函数
取得一个未初始化栈顶槽;容量不足时自动扩容。
ptr xrtStackAdd(xstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 未初始化栈顶槽 | — |
NULL | 扩容失败 | XERR_RANGE / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量溢出XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 取得栈顶槽
int* pSlot = (int*)xrtStackAdd(pStack);
xrtStackPush函数
复制一个元素压入动态栈;容量不足时自动扩容。
bool xrtStackPush(xstack* pStack, const void* pItem)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pItem | 输入 | 非空 | 要压入的元素 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已压入 | — |
false | 扩容失败 | XERR_RANGE / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量溢出XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 复制压入
if ( !xrtStackPush(pStack, &iValue) ) {
xrtStackPop函数
弹出栈顶元素,并可把内容复制到外部输出缓冲。
bool xrtStackPop(xstack* pStack, ptr pItem)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pItem | 输出 | 允许空;不与栈重叠 | 接收弹出的元素 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已弹出 | — |
false | 栈空或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
cstack · 弹出
while ( xrtStackPop(&tValues, &iValue) ) {
xrtStackPeek函数
返回距栈顶指定深度的可写元素,深度 0 表示栈顶。
ptr xrtStackPeek(xstack* pStack, size_t iDepth)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iDepth | 输入 | < 深度 | 距栈顶深度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 深度取写
(void)xrtStackPeek(pStack, 0u);
xrtStackConstPeek函数
返回距栈顶指定深度的只读元素,深度 0 表示栈顶。
const void* xrtStackConstPeek(const xstack* pStack, size_t iDepth)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iDepth | 输入 | < 深度 | 距栈顶深度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 深度取读
const int* pPeek = (const int*)xrtStackConstPeek(pStack, 0u);
xrtStackTop函数
返回可写栈顶元素借用地址。
ptr xrtStackTop(xstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
tour · 栈顶写
int* pTop = (int*)xrtStackTop(pStack);
xrtStackConstTop函数
返回只读栈顶元素借用地址。
const void* xrtStackConstTop(const xstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
tour · 栈顶读
(void)xrtStackConstTop(pStack);
LIFO 与低层访问
xrtBlockStackInit函数
使用自动块尺寸初始化默认对齐分块栈。
bool xrtBlockStackInit(xblockstack* pStack, size_t iItemSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输出 | 非空 | 接收栈 |
iItemSize | 输入 | > 0 | 元素字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已初始化 | — |
false | 布局参数非法 | 见错误 |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量或尺寸计算溢出XERR_VALUE — 对齐不是二次幂XERR_MEMORY — 缓冲分配失败
范例已编译验证
tour · 默认初始化
(void)xrtBlockStackInit(&tInit, sizeof(int));
xrtBlockStackInitLayout函数
使用指定元素对齐和每块元素数初始化分块栈。
bool xrtBlockStackInitLayout(xblockstack* pStack, size_t iItemSize, size_t iAlignment, size_t iBlockItems)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输出 | 非空 | 接收栈 |
iItemSize | 输入 | > 0 | 元素字节数 |
iAlignment | 输入 | 二次幂 | 元素对齐 |
iBlockItems | 输入 | > 0 | 每块元素数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已初始化 | — |
false | 布局参数非法 | 见错误 |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量或尺寸计算溢出XERR_VALUE — 对齐不是二次幂XERR_MEMORY — 缓冲分配失败
范例已编译验证
block · 完整布局初始化
if ( !xrtBlockStackInitLayout(&tFrames, sizeof(int), sizeof(int), 4) ) {
xrtBlockStackCreate函数
创建使用自动块尺寸的默认对齐分块栈。
xblockstack* xrtBlockStackCreate(size_t iItemSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iItemSize | 输入 | > 0 | 元素字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 分块栈 | — |
NULL | 创建失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量或尺寸计算溢出XERR_VALUE — 对齐不是二次幂XERR_MEMORY — 缓冲分配失败
范例已编译验证
tour · 堆创建
xblockstack* pBlock = xrtBlockStackCreate(sizeof(int));
xrtBlockStackCreateLayout函数
创建使用指定元素对齐和每块元素数的分块栈。
xblockstack* xrtBlockStackCreateLayout(size_t iItemSize, size_t iAlignment, size_t iBlockItems)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iItemSize | 输入 | > 0 | 元素字节数 |
iAlignment | 输入 | 二次幂 | 元素对齐 |
iBlockItems | 输入 | > 0 | 每块元素数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 分块栈 | — |
NULL | 创建失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量或尺寸计算溢出XERR_VALUE — 对齐不是二次幂XERR_MEMORY — 缓冲分配失败
范例已编译验证
tour · 堆创建(完整布局)
xrtBlockStackDestroy(xrtBlockStackCreateLayout(sizeof(int), 4u, 8u));
xrtBlockStackUnit函数
释放全部数据块和块索引,但不释放栈结构。
void xrtBlockStackUnit(xblockstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
block · 释放数据块
xrtBlockStackUnit(&tFrames);
xrtBlockStackDestroy函数
释放分块栈全部资源和创建的栈结构。
void xrtBlockStackDestroy(xblockstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
tour · 销毁
xrtBlockStackDestroy(xrtBlockStackCreateLayout(sizeof(int), 4u, 8u));
xrtBlockStackClear函数
清空分块栈并保留已经分配的数据块。
void xrtBlockStackClear(xblockstack* pStack)
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
范例已编译验证
tour · 清空
xrtBlockStackClear(pBlock);
xrtBlockStackReserve函数
保证分块栈至少具有指定元素容量,失败时保持原状态。
bool xrtBlockStackReserve(xblockstack* pStack, size_t iCapacity)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
iCapacity | 输入 | — | 期望容量 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 容量已保证 | — |
false | 扩容失败,原状态保持 | XERR_RANGE / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量溢出XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 预留容量
(void)xrtBlockStackReserve(pBlock, 16u);
xrtBlockStackTrim函数
释放当前深度不再需要的数据块,保留轻量块索引缓存。
bool xrtBlockStackTrim(xblockstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已裁剪 | — |
false | 裁剪失败 | XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 裁剪
(void)xrtBlockStackTrim(pBlock);
xrtBlockStackGet函数
返回指定 0 基位置的可写元素借用地址。
ptr xrtBlockStackGet(xblockstack* pStack, size_t iIndex)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iIndex | 输入 | < 深度 | 0 基位置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
block · 按位取写
xrtBlockStackGet(&tFrames, 0) == pRoot ? "yes" : "no"
xrtBlockStackConstGet函数
返回指定 0 基位置的只读元素借用地址。
const void* xrtBlockStackConstGet(const xblockstack* pStack, size_t iIndex)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iIndex | 输入 | < 深度 | 0 基位置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 按位取读
(void)xrtBlockStackConstGet(pBlock, 0u);
xrtBlockStackAdd函数
取得一个未初始化栈顶槽,既有活动元素地址保持稳定。
ptr xrtBlockStackAdd(xblockstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 未初始化栈顶槽 | — |
NULL | 新块分配失败 | XERR_RANGE / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 块布局尺寸溢出XERR_MEMORY — 扩容分配失败
范例已编译验证
block · 取得栈顶槽
pRoot = (int*)xrtBlockStackAdd(&tFrames);
xrtBlockStackPush函数
浅复制一个完整可读元素压入分块栈,来源可以是任一活动元素。
bool xrtBlockStackPush(xblockstack* pStack, const void* pItem)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pItem | 输入 | 非空 | 要压入的元素 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已压入 | — |
false | 分配失败 | XERR_RANGE / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 块布局尺寸溢出XERR_MEMORY — 扩容分配失败
范例已编译验证
block · 浅复制压入
if ( !xrtBlockStackPush(&tFrames, &i) ) {
xrtBlockStackPop函数
弹出栈顶元素;调用方必须保证可选输出不与该栈的任何数据块重叠。
bool xrtBlockStackPop(xblockstack* pStack, ptr pItem)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pItem | 输出 | 允许空;不与数据块重叠 | 接收弹出的元素 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已弹出 | — |
false | 栈空或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
tour · 弹出
(void)xrtBlockStackPop(pBlock, &iPop);
xrtBlockStackPeek函数
返回距栈顶指定深度的可写元素,深度 0 表示栈顶。
ptr xrtBlockStackPeek(xblockstack* pStack, size_t iDepth)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iDepth | 输入 | < 深度 | 距栈顶深度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 深度取写
(void)xrtBlockStackPeek(pBlock, 0u);
xrtBlockStackConstPeek函数
返回距栈顶指定深度的只读元素,深度 0 表示栈顶。
const void* xrtBlockStackConstPeek(const xblockstack* pStack, size_t iDepth)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iDepth | 输入 | < 深度 | 距栈顶深度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 深度取读
(void)xrtBlockStackConstPeek(pBlock, 0u);
xrtBlockStackTop函数
返回可写栈顶元素借用地址。
ptr xrtBlockStackTop(xblockstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
tour · 栈顶写
(void)xrtBlockStackTop(pBlock);
xrtBlockStackConstTop函数
返回只读栈顶元素借用地址。
const void* xrtBlockStackConstTop(const xblockstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读元素借用地址 | — |
NULL | 越界或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
tour · 栈顶读
const int* pTop = (const int*)xrtBlockStackConstTop(pBlock);
PtrStack
xrtPtrStackInit函数
初始化空指针栈。
bool xrtPtrStackInit(xptrstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已初始化 | — |
false | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
范例已编译验证
pstack · 初始化
if ( !xrtPtrStackInit(&tResources) ) {
xrtPtrStackCreate函数
创建空指针栈。
xptrstack* xrtPtrStackCreate()
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 指针栈 | — |
NULL | 分配失败 | XERR_MEMORY |
范例已编译验证
tour · 堆创建
xptrstack* pPtr = xrtPtrStackCreate();
xrtPtrStackUnit函数
释放指针存储区但不释放指针目标。
void xrtPtrStackUnit(xptrstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
pstack · 释放存储
xrtPtrStackUnit(&tResources);
xrtPtrStackDestroy函数
释放指针栈全部资源和栈结构,但不释放指针目标。
void xrtPtrStackDestroy(xptrstack* pStack)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
tour · 销毁
xrtPtrStackDestroy(pPtr);
xrtPtrStackClear函数
清空指针栈并保留容量,但不释放指针目标。
void xrtPtrStackClear(xptrstack* pStack)
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
范例已编译验证
tour · 清空
xrtPtrStackClear(pPtr);
xrtPtrStackReserve函数
保证指针栈至少具有指定容量。
bool xrtPtrStackReserve(xptrstack* pStack, size_t iCapacity)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
iCapacity | 输入 | — | 期望容量 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 容量已保证 | — |
false | 扩容失败 | XERR_RANGE / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量溢出XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 预留容量
(void)xrtPtrStackReserve(pPtr, 16u);
xrtPtrStackTrim函数
将指针栈容量裁剪到当前深度。
bool xrtPtrStackTrim(xptrstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已裁剪 | — |
false | 裁剪失败 | XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_MEMORY — 扩容分配失败
范例已编译验证
tour · 裁剪容量
(void)xrtPtrStackTrim(pPtr);
xrtPtrStackGet函数
返回指定 0 基位置的指针值。
ptr xrtPtrStackGet(const xptrstack* pStack, size_t iIndex)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iIndex | 输入 | < 深度 | 0 基位置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 指针值 | 存储的值(可为空值) | — |
NULL | 越界 | XERR_RANGE |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 按位取值
(void)xrtPtrStackGet(pPtr, 0u);
xrtPtrStackPush函数
压入一个可为空的指针值;容量不足时自动扩容。
bool xrtPtrStackPush(xptrstack* pStack, ptr pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pValue | 输入 | 任意值 | 要压入的指针 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已压入 | — |
false | 扩容失败 | XERR_RANGE / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 容量溢出XERR_MEMORY — 扩容分配失败
范例已编译验证
pstack · 压入
if ( !xrtPtrStackPush(&tResources, &pValues[i]) ) {
xrtPtrStackPop函数
弹出指针值;输出为空表示只删除栈顶。
bool xrtPtrStackPop(xptrstack* pStack, ptr* pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入/输出 | 非空 | 目标栈 |
pValue | 输出 | 允许空 | 接收弹出的值 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已弹出 | — |
false | 栈空或参数非法 | XERR_RANGE / XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
pstack · 弹出
while ( xrtPtrStackPop(&tResources, &pValue) ) {
xrtPtrStackPeek函数
返回距栈顶指定深度的指针值,深度 0 表示栈顶。
ptr xrtPtrStackPeek(const xptrstack* pStack, size_t iDepth)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pStack | 输入 | 非空 | 目标栈 |
iDepth | 输入 | < 深度 | 距栈顶深度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 指针值 | 存储的值(可为空值) | — |
NULL | 越界 | XERR_RANGE |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 索引或深度越界
范例已编译验证
tour · 深度取值
(void)xrtPtrStackPeek(pPtr, 0u);
xrtPtrStackTop函数
返回栈顶指针值;合法空值与错误通过错误状态区分。
ptr xrtPtrStackTop(const xptrstack* pStack)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 指针值 | 栈顶值(可为合法空值) | — |
NULL | 栈空 | XERR_RANGE |
错误XERR_ARGUMENT — 指针为空、元素大小为零或参数非法XERR_RANGE — 栈为空
范例已编译验证
tour · 栈顶值
ptr pTop = xrtPtrStackTop(pPtr);
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
| XRT_BLOCK_STACK_BYTES_DEFAULT | 见头文件注释 |
| XRT_BLOCK_STACK_ITEMS_MAX | 见头文件注释 |