C语言函数大全-- z 开头的函数

2023-11-06

1. zalloc

1.1 函数说明

函数声明 函数功能
voidpf zalloc (voidpf opaque, uInt items, uInt size); 它 是 zlib 库中的函数之一,用于动态分配内存并返回指向已分配内存的指针。它使用了 zlib 中的内存管理器,并支持在压缩时自定义内存管理函数

参数:

  • opaque : 传递给 zlib 内存管理器的不透明指针,可以为 NULL
  • items : 请求分配的元素数量
  • size : 每个元素的大小

返回值:

  • 如果分配成功,则返回已分配内存的指针;
  • 如果分配失败,则返回 NULL

1.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include "zlib.h"

int main() 
{
	// 分配了 10 个整数大小的内存
    void *ptr = zalloc(NULL, 10, sizeof(int));
    if (ptr == NULL) 
    {
        printf("Failed to allocate memory.\n");
        exit(-1);
    }
    int *p = (int*) ptr;
    for (int i = 0; i < 10; i++) 
    {
        p[i] = i;
    }
    for (int i = 0; i < 10; i++) 
    {
        printf("%d ", p[i]);
    }
    printf("\n");
	// 释放上述分配的内存
    free(ptr);
    return 0;
}

2. zcalloc

2.1 函数说明

函数声明 函数功能
voidpf zcalloc (voidpf opaque, unsigned items, unsigned size); 它是 zlib 库的内存分配器,用于分配 items * size 字节大小的连续内存空间,该内存空间初始值为零。同时它还支持指定 opaque 参数作为可选的透明指针,以便在内存分配时使用。

参数:

  • opaque : 指向任意类型的指针,表示可选的、不透明的指针,如果没有特殊需求,可以设置为 NULL
  • items : 无符号整型,表示要分配的元素个数
  • size : 无符号整型,表示每个元素占用的字节数

返回值:

  • 如果分配成功,则返回指向分配内存起始地址的指针;
  • 如果分配失败,则返回 NULL

2.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include "zlib.h"

int main()
{
    void *ptr;
    unsigned int items = 100;
    unsigned int size = sizeof(int);
    
    // 分配 100 个 int 类型的内存空间,并初始化为零
    ptr = zcalloc(NULL, items, size);
    
    if (ptr != NULL)
    {
        printf("Memory allocation successful!\n");
        // do something with the allocated memory
        
        // 释放内存空间
        zcfree(ptr);
    }
    else
    {
        printf("Memory allocation failed!\n");
    }

    return 0;
}

3. zcfree

3.1 函数说明

函数声明 函数功能
void zcfree(void *ptr); 它是 Zlib 库中的一个函数,用于释放 zcalloc() 分配的内存空间

参数:

  • ptr: 指向要释放的内存空间的指针

3.2 演示示例

详见 2.2 中 演示示例

4. zclearerr

4.1 函数说明

函数声明 函数功能
void zclearerr(z_stream *stream); 它是 zlib 库中的一个函数,它用于清除 z_stream 结构体中的错误标志和结束标志,以便重新使用该结构体来进行数据压缩或解压缩

参数:

  • stream: 一个指向 z_stream 结构体的指针作为参数,包含了进行数据压缩或解压缩时所需的所有信息

4.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zlib.h"

#define CHUNK_SIZE 1024

int main()
{
    gzFile file;
    char buffer[CHUNK_SIZE];
    int bytes_read;

    if (argc != 2) 
    {
        fprintf(stderr, "Usage: %s file.gz\n", argv[0]);
        exit(1);
    }

    file = gzopen(argv[1], "rb");
    if (!file) 
    {
        fprintf(stderr, "Error opening file %s\n", argv[1]);
        exit(1);
    }

    // Read the first chunk of data from the file.
    bytes_read = gzread(file, buffer, CHUNK_SIZE);

    while (bytes_read > 0) 
    {
        // Process the data...
        
        // Clear the error state before reading the next chunk.
        zclearerr(file);
        
        // Read the next chunk of data from the file.
        bytes_read = gzread(file, buffer, CHUNK_SIZE);
    }

    if (bytes_read < 0) 
    {
        fprintf(stderr, "Error reading file %s: %s\n", argv[1], gzerror(file, NULL));
        exit(1);
    }

    gzclose(file);

    return 0;
}

在上面的示例代码中,演示了使用 zlib 库来读取 gzip 压缩文件中的数据:

  • 首先,程序会检查命令行参数是否正确,如果不正确,则输出使用方法并退出程序。
  • 然后,程序会使用 gzopen() 函数打开指定的 gzip 文件,并将返回的文件指针保存在 file 变量中。如果文件打开失败,则输出错误信息并退出程序。
  • 接着,程序会循环读取文件中的数据,每次读取 CHUNK_SIZE 大小的数据到 buffer 数组中。当读取到文件末尾时,gzread() 函数会返回 0,此时循环结束。如果读取过程中出现错误,例如文件损坏或者压缩格式不正确,那么 gzread() 函数会返回负数,表示出错了。

    注意: 在每次读取完数据之后,程序需要处理读取到的数据。具体的处理方式根据实际应用而定,这里没有给出相应的代码。如果需要读取更多的数据,程序需要调用 zclearerr 函数来清除可能存在的错误状态,并再次调用 gzread 函数来读取数据。

  • 最后,调用 gzclose() 函数关闭文件并释放资源,然后返回 0 表示程序正常结束。如果读取文件过程中出现错误,则输出错误信息并返回 1 表示程序异常结束。

5. zError

5.1 函数说明

函数声明 函数功能
const char *zError(int err); 用于返回与给定错误代码对应的错误信息字符串

参数:

  • err : 错误码
    • 如果 err 的取值为 Z_OK 时,该函数将返回 "ok"
    • 如果 err 的值为 Z_STREAM_END,该函数将返回 "stream end"
    • 如果 err 的取值为 Z_MEM_ERROR 时,该函数会返回 "out of memory",表示内存不足;
    • 如果 err 的取值为 Z_BUF_ERROR 时,该函数会返回 "buffer error",表示缓冲区出错。

5.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zlib.h"

#define CHUNK 1024

int main() 
{
    char *source = "Hello, world!";
    size_t sourceLen = strlen(source) + 1;

    printf("Source: %s\n", source);

    // 压缩数据
    uLongf destLen = compressBound(sourceLen);
    Bytef *dest = (Bytef *)malloc(destLen);
    int res = compress(dest, &destLen, (const Bytef*)source, sourceLen);

    if (res != Z_OK) 
    {
        printf("Error during compression: %s\n", zError(res));
        return 1;
    }

    printf("Compressed: ");
    for (uLongf i = 0; i < destLen; i++) 
    {
        printf("%02x ", dest[i]);
    }
    printf("\n");

    // 解压数据
    char *uncompressed = (char *)malloc(sourceLen);
    res = uncompress((Bytef*)uncompressed, &sourceLen, dest, destLen);

    if (res != Z_OK) 
    {
        printf("Error during decompression: %s\n", zError(res));
        return 1;
    }

    printf("Uncompressed: %s\n", uncompressed);

    free(dest);
    free(uncompressed);
    return 0;
}

在上述的示例代码中,

  • 首先,定义了一个字符串"Hello, world!",并计算其长度;
  • 然后,使用 compressBound() 函数计算需要分配的 dest 缓冲区的大小,并使用 malloc() 函数动态分配内存;
  • 接着,调用 compress() 函数对源数据进行压缩,将压缩结果存储到dest缓冲区中,并检查是否出现了错误;
  • 再然后,输出压缩结果的十六进制表示;
  • 再接着,使用 malloc() 函数再次动态分配内存以存储解压后的数据,并调用 uncompress() 函数进行解压缩,并检查是否出现了错误;
  • 最后,输出解压后的字符串,并释放动态分配的内存。

6. zlibVersion

6.1 函数说明

函数声明 函数功能
const char* zlibVersion(void); 获取当前Zlib版本号

6.2 演示示例

#include <stdio.h>
#include <zlib.h>

int main()
{
    const char *version = zlibVersion();
    printf("Zlib version: %s\n", version);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言函数大全-- z 开头的函数 的相关文章

  • C语言函数大全-- w 开头的函数(1)

    w 开头的函数 1 1 wcscat 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 wcschr 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 wcscmp 3 1 函数说明 3 2 演示示例 3 3 运行结果 4
  • C语言函数大全-- _w 开头的函数(4)

    w 开头的函数 4 1 wstrtime 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 wstrtime s 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 wsetlocale 3 1 函数说明 3 2 演示示例 3
  • C语言函数大全-- x 开头的函数(3)

    x 开头的函数 3 1 xdr opaque 1 1 函数说明 1 2 演示示例 2 xdr opaque auth 2 1 函数说明 2 2 演示示例 2 2 1 opaque auth 2 2 2 test c 3 xdr pointe
  • C语言函数大全-- l 开头的函数

    l 开头的函数 1 labs llabs 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 ldexp ldexpf ldexpl 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 ldiv lldiv 3 1 函数说明 3
  • C语言函数大全-- l 开头的 Linux 内核函数(链表管理函数)

    l 开头的 Linux 内核函数 链表管理函数 1 list add list add tail 1 1 函数说明 1 2 演示示例 2 list cut before list cut position 2 1 函数说明 2 2 演示示例
  • C语言函数大全-- s 开头的函数(3)

    s 开头的函数 3 1 sleep 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 sopen 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 sound 3 1 函数说明 3 2 演示示例 4 spawnl 4 1 函
  • C语言函数大全-- s 开头的函数(2)

    s 开头的函数 2 1 setlinestyle 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 setmem 2 1 函数说明 2 2 演示示例 3 setmode 3 1 函数说明 3 2 演示示例 3 3 运行结果 4 se
  • C语言函数大全-- z 开头的函数

    z 开头的函数 1 zalloc 1 1 函数说明 1 2 演示示例 2 zcalloc 2 1 函数说明 2 2 演示示例 3 zcfree 3 1 函数说明 3 2 演示示例 4 zclearerr 4 1 函数说明 4 2 演示示例
  • C语言函数大全-- x 开头的函数(5)

    x 开头的函数 5 1 xdrmem create 1 1 函数说明 1 2 演示示例 2 xdrmem destroy 2 1 函数说明 2 2 演示示例 3 xdrrec create 3 1 函数说明 3 2 演示示例 4 xdrre
  • C语言函数大全-- t 开头的函数

    t 开头的函数 1 tan tanf tanl 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 tanh tanhf tanhl 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 tell 3 1 函数说明 3 2 演示示
  • C语言函数大全-- v 开头的函数

    v 开头的函数 1 va start 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 va arg 2 1 函数说明 2 2 演示示例 3 va copy 3 1 函数说明 3 2 演示示例 4 va end 4 1 函数说明 4
  • C语言函数大全--e开头的函数

    e开头的函数 1 ecvt 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 ellipse 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 eof 3 1 函数说明 3 2 演示示例 3 3 运行结果 4 execl 4
  • C语言函数大全--h开头的函数

    h开头的函数或宏 1 hypot hypotf hypotl 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 HUGE VAL HUGE VALF HUGE VALL 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 ha
  • C语言函数大全-- x 开头的函数(1)

    x 开头的函数 1 1 xdr accepted reply 1 1 函数说明 1 2 演示示例 1 2 1 accepted reply 1 2 2 Test c 2 xdr array 2 1 函数说明 2 2 演示示例 3 xdr a
  • C语言函数大全-- k 开头的函数

    k 开头的函数 1 kcalloc 1 1 函数说明 1 2 演示示例 2 kbhit 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 keep 3 1 函数说明 3 2 演示示例 4 kernel thread 4 1 函数说明
  • C语言函数大全-- r 开头的函数

    r 开头的函数 1 raise 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 rand 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 read 3 1 函数说明 3 2 演示示例 3 3 运行结果 4 realloc
  • C语言函数大全-- y 开头的函数

    y 开头的函数 1 yperror 1 1 函数说明 1 2 演示示例 2 yp match 2 1 函数说明 2 2 演示示例 3 y0 零阶第二类贝塞尔函数 3 1 函数说明 3 2 演示示例 3 3 运行结果 4 y1 一阶第二类贝塞
  • C语言函数大全--f开头的函数(下)

    f开头的函数 下 21 floor floorf floorl 21 1 函数说明 21 2 演示示例 21 3 运行结果 22 flushall 22 1 函数说明 22 2 演示示例 22 3 运行结果 23 fma fmaf fmal
  • C语言函数大全-- i 开头的函数

    i 开头的函数 1 imagesize 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 initgraph 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 inport 3 1 函数说明 3 2 演示示例 4 insli
  • C语言函数大全-- x 开头的函数(4)

    x 开头的函数 4 1 xdr struct 1 1 函数说明 1 2 演示示例 2 xdr u char 2 1 函数说明 2 2 演示示例 3 xdr u hyper 3 1 函数说明 3 2 演示示例 4 xdr u int 4 1

随机推荐

  • An error happened during template parsing 错误解决

    学习记录 idea启动web项目出现问题 An error happened during template parsing 出现原因 web资源路径没有正确导入 解决方法 添加或修改正确的路径
  • 一步步教你修改Windows本地hosts文件,轻松修改域名指向!

    一步步教你修改Windows本地hosts文件 轻松修改域名指向 简介 一 什么是hosts文件 二 准备工作 二 定位hosts文件 三 修改hosts文件 四 刷新DNS缓存 五 验证修改结果 结论 简介 在前端开发过程中 我们经常需要
  • 【Django学习笔记 - 18】:drf请求响应简介、基类(APIView、GenericAPIView)、mixin扩展类与三级视图、视图集与路由

    文章目录 drf请求响应简介 请求Request 常用属性 响应Response 构造方式 参数说明 Response常用属性 基类 APIView的使用 使用案例 案例一 查看drf的结构 案例二 使用post请求获取表单和非表单数据 案
  • 【Vue】学习笔记-组件传值

    Vue 学习笔记 组件传值 前言 1 父级向子级传递数据 2 子级向父级传递数据 常见错误总结 前言 组件之间的传值可以分为三种 1 父级向子级传递数据 2 子级向父级传递数据 3 非父子级传递数据 本文主要讲解父级向子级传递数据和子级向父
  • 探索接入网和网络运营商——ADSL接入网的结构和工作方式

    1 互联网的基本机构和家庭 公司网络是相同的 互联网的基本工作方式和家庭 公司网络一样 互联网也是通过路由器来转发包的 而且路由器的基本结构和工作方式也并没有什么不同 当然也有不同之处 其中之一就是与转发设备间的距离 在家庭 公司网络中 与
  • 海外有哪些流行的支付方式?

    大家好 我是老三 很久没写支付相关的文章了 这期给大家讲一讲 海外都在用哪些支付方式 简介 我们先来看下两个主流电商产品的美国站的支付方式 在国内 想必大家都习惯了支付宝和微信支付二分天下 这两种支付方式基本上覆盖了90 的支付需求 但是在
  • vue 使用cos-js-sdk-v5 进行文件其它方式的上传操作

    首先进行安装 npm install cos js sdk v5 下面是讲http与其结合 封装的js多次可使用 import COS from cos js sdk v5 封装http请求 function http method get
  • 【华为OD机试】代表团坐车【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 某组织举行会议 来了多个代表团同时到达 接待处只有一辆汽车 可以同时接待多个代表团 为了提高车辆利用率 请帮接待员计算可以坐满车的接待方案 输出方案数量 约束 1 一
  • 对于随机森林的通俗理解

    一 决策树 决策树是机器学习最基本的模型 在不考虑其他复杂情况下 我们可以用一句话来描述决策树 如果得分大于等于60分 那么你及格了 这是一个最最简单的决策树的模型 我们把及格和没及格分别附上标签 及格 1 没及格 0 那么得到的决策树是这
  • docker 的具名挂载与匿名挂载

    大家好 今天我们分享一下docker 的具名挂载与匿名挂载 以这条命令举例 root localhost docker run d P name nginx02 v etc nginx nginx d8e9b9084cf884e7e0d11
  • 【图像检测】基于DeepPupil Net 实现眼中心定位附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • IEC104协议的参数设置

    本文主要是IEC104协议的参数的定义及个人的理解 如有错误请指正 重要参数 104规约规定了两个参数K和W 其取值为1到32767 其中K表示发送方在有K个I格式报文未得到对方的确认时 将停止数据发送 W表示接收方最迟在接收W个I格式报文
  • 数据库复习基本概念——关系、元组、属性、码、域、分量、形式化定义

    1 关系 Relation 一个关系对应通常说的一张表 2 元组 Tuple 表中的一行即为一个元组 3 属性 Attribute 表中的一列即为一个属性 给每一个属性起一个名称 即属性名 4 码 键 码是数据系统中的基本概念 所谓码就是能
  • CTFweb篇——签到题

    0x00 前言 一个简单的CTF签到题 0x01 打开靶场 0x02 打开靶场地址发现信息 通过题目提示信息使用burpsuit抓包 Send to Repeater 然后查看 Repeater 点击GO 在Response中 Header
  • Git使用常见问题解决方法汇总

    1 在Ubuntu下使用 git clone时出现server certificate verification failed CAfile etc ssl certs ca certificates crt CRLfile none 解决
  • Java Web-servlet技术-重定向与转发

    1 创建Verify java的servlet文件 重写doGet 方法 package myservlet import java io IOException import java io PrintWriter import java
  • JMeter-Eclipse添加自定义函数 MD5加密 32位和16位

    最近公司的接口都是MD5 16位加密 所以要使用加密功能 之前也做过加密 因为用的比较少 所以是写了一个加密方法 导出JAR包 调用的 用起来需要很多设置 并且换算效率也不高 听前同事说 jmeter可以自己写函数 放在函数管理里面 今天自
  • Fabric2.0.0环境搭建及链码操作详解

    安装软件 更新源 sudo apt get update 安装Go cd usr local 上传go的压缩包 sudo rz 解压压缩包 sudo tar zxf go1 14 4 linux amd64 tar gz 配置环境 vim
  • 使用9p virtFS在宿主机和vm之间共享多个文件 sharing multiple host files with guest using 9p virtFS

    目录 前置条件 准备共享目录 编辑qemu conf 前置条件 根据qemu官方文档 首先准备前置条件 测试条件为pve 7 1 10 omv 5 6 26 1 omv 6 0 19 debian 11 首先确保guest的kernel中的
  • C语言函数大全-- z 开头的函数

    z 开头的函数 1 zalloc 1 1 函数说明 1 2 演示示例 2 zcalloc 2 1 函数说明 2 2 演示示例 3 zcfree 3 1 函数说明 3 2 演示示例 4 zclearerr 4 1 函数说明 4 2 演示示例