news 2026/6/11 16:07:57

【C语言】实现简单动态数组(线程安全)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C语言】实现简单动态数组(线程安全)

头文件

#ifndef_CVECTOR_H_#define_CVECTOR_H_typedefvoid*cvector;// 初始化cvectorcvector_create(size_tcapacity);// 销毁voidcvector_destroy(cvector vector);// 一次性分配内存size_tcvector_reserve(cvector vector,size_tcapacity);// 获取元素个数size_tcvector_size(cvector vector);// 获取容量size_tcvector_capacity(cvector vector);// 遍历打印voidcvector_display(cvector vector,void(*display)(void*data));// 尾部添加一个元素voidcvector_push_back(cvector vector,void*data);// 尾部删除一个元素void*cvector_pop_back(cvector vector);// 指定位置插入一个元素voidcvector_insert(cvector vector,size_tindex,void*data);// 指定位置删除一个元素void*cvector_erase(cvector vector,size_tindex);// 清空voidcvector_clear(cvector vector);#endif// _CVECTOR_H_

c文件

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>#include"cvector.h"// -----------------------------------------------------------------------------// cvector结构体// - data: 存储数据的指针// - size: 当前存储的数据个数// - capacity: 当前容量// -----------------------------------------------------------------------------typedefstructcvector{void**data;size_tsize;size_tcapacity;SRWLOCK srwlock;}CVECTOR,*PCVECTOR;// 抽取扩容函数staticintcvector_resize(cvector vector){if(NULL==vector)return0;PCVECTOR v=(PCVECTOR)vector;// 扩容新容量大小size_tnew_capacity=v->capacity+v->capacity/2;if(new_capacity<v->capacity)return0;void**data=(void**)realloc(v->data,new_capacity*sizeof(void*));if(NULL==data)return0;v->data=data;v->capacity=new_capacity;return1;}// 抽取的尾部插入函数staticvoid_cvector_push_back(cvector vector,void*data){if(NULL==vector||NULL==data)return;PCVECTOR v=(PCVECTOR)vector;if(v->size>=v->capacity){if(!cvector_resize(vector))return;}v->data[v->size++]=data;}// -----------------------------------------------------------------------------// 创建一个cvector// - capacity: 初始容量// -----------------------------------------------------------------------------cvectorcvector_create(size_tcapacity){if(capacity==0){returnNULL;}PCVECTOR vector=(PCVECTOR)malloc(sizeof(CVECTOR));if(NULL==vector){returnNULL;}memset(vector,0,sizeof(CVECTOR));vector->data=malloc(sizeof(void*)*capacity);if(NULL==vector->data){free(vector);returnNULL;}vector->size=0;vector->capacity=capacity;// 初始化读写锁InitializeSRWLock(&(vector->srwlock));returnvector;}// -----------------------------------------------------------------------------// 销毁// - vector: cvector指针, 传入NULL则不操作// -----------------------------------------------------------------------------voidcvector_destroy(cvector vector){if(NULL==vector){return;}// 类型转换PCVECTOR v=(PCVECTOR)vector;// 写锁AcquireSRWLockExclusive(&(v->srwlock));// 释放数据if(NULL!=v->data){free(v->data);}// 解锁ReleaseSRWLockExclusive(&(v->srwlock));// 释放结构体free(v);}// 一次性分配内存size_tcvector_reserve(cvector vector,size_tcapacity){if(NULL==vector||capacity==0)return0;PCVECTOR v=(PCVECTOR)vector;// 写锁AcquireSRWLockExclusive(&(v->srwlock));if(v->capacity>=capacity){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnv->capacity;}void**_temp=realloc(v->data,sizeof(void*)*capacity);if(NULL==_temp){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnv->capacity;}v->data=_temp;v->capacity=capacity;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnv->capacity;}// -----------------------------------------------------------------------------// 获取当前存储的数据个数// - vector: cvector指针// -----------------------------------------------------------------------------size_tcvector_size(cvector vector){if(NULL==vector){return0;}PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockShared(&(v->srwlock));size_t_size=v->size;// 解锁ReleaseSRWLockShared(&(v->srwlock));return_size;}// -----------------------------------------------------------------------------// 获取当前容量// - vector: cvector指针// -----------------------------------------------------------------------------size_tcvector_capacity(cvector vector){if(NULL==vector)return0;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockShared(&(v->srwlock));size_t_capacity=v->capacity;// 解锁ReleaseSRWLockShared(&(v->srwlock));return_capacity;}// -----------------------------------------------------------------------------// 遍历打印// - vector: cvector指针// - display: 打印函数指针// -----------------------------------------------------------------------------voidcvector_display(cvector vector,void(*display)(void*data)){if(NULL==vector||NULL==display)return;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockShared(&(v->srwlock));for(inti=0;i<v->size;i++){display(v->data[i]);}// 解锁ReleaseSRWLockShared(&(v->srwlock));}// -----------------------------------------------------------------------------// 在尾部插入数据// - vector: cvector指针// - data: 数据指针// -----------------------------------------------------------------------------voidcvector_push_back(cvector vector,void*data){if(NULL==vector)return;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));_cvector_push_back(vector,data);// 解锁ReleaseSRWLockExclusive(&(v->srwlock));}// -----------------------------------------------------------------------------// 在尾部删除一个元素// - vector: cvector指针//// Return:// - 返回被删除的元素指针// -----------------------------------------------------------------------------void*cvector_pop_back(cvector vector){// 当列表为NULL或者或者size为0时,返回NULLif(NULL==vector)returnNULL;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));if(v->size<=0){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnNULL;}void*_temp=v->data[v->size-1];v->size--;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));return_temp;}// 指定位置插入一个元素voidcvector_insert(cvector vector,size_tindex,void*data){if(NULL==vector||NULL==data)return;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));// 判断是否需要扩容if(v->size>=v->capacity){intret=cvector_resize(vector);if(0==ret){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));return;}}// 如果index >= size 则进行尾部插入if(index>=v->size){_cvector_push_back(vector,data);// 解锁ReleaseSRWLockExclusive(&(v->srwlock));return;}// 其他情况,进行中间插入//for (int i = v->size; i > index; i--)//{// v->data[i] = v->data[i - 1];//}// 数据后移memmove(&v->data[index+1],&v->data[index],sizeof(void*)*(v->size-index));v->data[index]=data;v->size++;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));}// 指定位置删除一个元素void*cvector_erase(cvector vector,size_tindex){if(NULL==vector)returnNULL;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));if(index>=v->size||v->size==0){// 解锁ReleaseSRWLockExclusive(&(v->srwlock));returnNULL;}void*_temp=v->data[index];// 数据前移//for (int i = index; i < v->size - 1; i++)//{// v->data[i] = v->data[i + 1];//}memmove(&v->data[index],&v->data[index+1],sizeof(void*)*(v->size-index-1));v->size--;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));return_temp;}// -----------------------------------------------------------------------------// 清空// - vector: cvector指针// -----------------------------------------------------------------------------voidcvector_clear(cvector vector){if(NULL==vector)return;PCVECTOR v=(PCVECTOR)vector;// 加锁AcquireSRWLockExclusive(&(v->srwlock));v->size=0;// 解锁ReleaseSRWLockExclusive(&(v->srwlock));}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 16:07:24

Vim 实战:在 VS Code、JetBrains、终端里玩转 Vim

Vim 的精髓不在于“抛弃鼠标”&#xff0c;而在于用键盘语法思考——将“删除”、“复制”、“粘贴”这些动词与“单词”、“段落”、“括号内”这些名词组合&#xff0c;形成一套高效的编辑语言。这套肌肉记忆&#xff0c;可以在几乎所有主流 IDE 中复用。下面我们分三步走&am…

作者头像 李华
网站建设 2026/6/8 5:44:51

告别重复造轮子:用快马AI一键生成高效Token管理工具库

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请生成一个专注于提升Token管理效率的独立工具模块代码。核心功能需求&#xff1a;1、Token生成器&#xff1a;支持可配置的JWT生成&#xff0c;包括密钥、过期时间、签发者、自定…

作者头像 李华
网站建设 2026/6/6 19:43:34

靠谱的设计思考培训机构怎么选?查看资质验证三要素——国际授权、实战师资、名企背书

近年来&#xff0c;设计思考作为一套以人为本的创新方法论&#xff0c;在国内企业、高校乃至个人学习者中受到越来越多的关注。随之而来的是&#xff0c;各类设计思考培训机构如雨后春笋般涌现。然而&#xff0c;课程质量参差不齐、证书含金量难以辨别、“国际认证”头衔真假难…

作者头像 李华
网站建设 2026/6/6 19:41:00

如何选择远心镜头内同轴光源和外同轴光源

机器视觉领域&#xff0c;成像硬件的选择直接影响成像质量&#xff0c;而镜头与光源的搭配更是关键中的关键。许多工程师在实际项目中常面临一个难题&#xff1a;远心镜头内同轴光源和外同轴光源到底如何选择&#xff1f; 今天我们将从原理、效果、适用场景&#xff0c;为你对比…

作者头像 李华
网站建设 2026/6/8 8:25:40

2026年6月展台设计搭建公司推荐:五大排行专业评测性价比高价格

摘要当企业加速全球化参展布局&#xff0c;展台设计搭建已从单一的空间装饰升级为品牌战略落地的关键环节。决策者面临的核心焦虑在于&#xff1a;如何在信息过载、服务商水平参差的市场中&#xff0c;精准筛选出既能理解品牌诉求、又能高效执行海外落地的合作伙伴。根据国际展…

作者头像 李华
网站建设 2026/6/8 16:10:16

从‘大泥球’到‘乐高积木’:实战复盘我们团队如何一步步将单体应用拆成微服务(含踩坑记录)

从“大泥球”到“乐高积木”&#xff1a;一个技术团队的微服务拆分实战手记引言&#xff1a;我们为何要拆解这个“庞然大物”三年前&#xff0c;当我第一次打开我们的核心业务系统时&#xff0c;映入眼帘的是一个超过200万行代码的庞然大物。编译需要45分钟&#xff0c;启动耗时…

作者头像 李华