`
javasogo
  • 浏览: 1837495 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

[原创]c语言动态数组

阅读更多
项目组成部分
原来有些程序在windows上写的,到linux下面多少有些不同,用了点时间现在还在整理规范移植过来,下面是动态数组的部分,以后还会陆续把新的贴上来,用到了前面的内存池

arrays。c

/*
* File: arrays.c:动态数组函数实现
* 声明:此函数功能不具备线程安全性,所以在使用过程中不建议用于公共变量,建议在函数内部使用
* 所有以Array开头的函数说明参数内存为栈,所有以Array结尾的函数说明参数内存为堆
* 所有传入数组的堆内存,一旦调用FreeAray或者于内存操作相关的函数就会将其全部释放,不需要逐个释放
* Author: netpet
* Flower net server
* 本程序是为一体化web server产品专用设计,具有部分代码为具体产品优化而不代表普遍通用性的特性
* 程序在linux 2.46下调试通过,编辑工具netbeans 6.1 for c
* 联系方式:Email:netpetboy@163.com QQ:51977431
* Created on 2008年5月29日, 上午10:44
*/
#include "arrays.h"
#include "memorys.h"
#include <stdio.h>
/*
*功能:实现一个Array结构体的初始化,能够包含DefaultArraySize大小个项目,每一个数组项需要重新内存分配
* 不接受非内存动态分配对象(栈上的数据,比如临时申请的字符串),否则会引起错误(函数在返回后可能就不存在了)
*参数:void
*返回:Array结构体
*/
Array * ArrayNew()
{
Array * arr=(Array *)New(2*DefaultArraySize*(sizeof(void *))+sizeof(Array));
arr->size=DefaultArraySize;
arr->index=0;
int i;
for(i=0;i<arr->size;i++)
{
arr->item[i][0]=NULL;
//第二个参数用来记录该项是栈还是堆的内存,便于释放时使用
arr->item[i][1]=NULL;
}
return arr;
}
/*
*功能:实现一个Array结构体的初始化,容量为给定的size
*参数:size:容器大小
*返回:Array数组
*/
Array * NewArray(int size)
{
Array * arr=(Array *)New(2*size*(sizeof(void *))+sizeof(Array));
arr->size=size;
arr->index=0;
int i;
for(i=0;i<arr->size;i++)
{
arr->item[i][0]=NULL;
//第二个参数用来记录该项是栈还是堆的内存,便于释放时使用
arr->item[i][1]=NULL;
}
return arr;
}
/*
*功能:返回给定数组指定索引处的值,索引以0开头
*参数:arr:给定的结构体,index:索引
*返回:void指针,如果为空或者给定Index大于数组的最大长度就返回NULL
*/
void * ArrayGet(Array * arr,int index)
{
if(index<arr->size)
return arr->item[index][0];
else
return NULL;
}
/*
*功能:设置给定数组的给定索引处的值
*声明:添加栈的数据到Array中。函数有可能改变原有内存位置,用新的内存来代替,所以参数需要数组的指针地址
* 如果Index大于容器体积,那么他会增加递归调用,只要满足能够让index包含
*参数: arr:给定的数组指针地址 index:要设置项的索引 value:设定的值
*返回:void
*/
void ArraySet(Array ** arr,int index,void * value)
{

if(index>(*arr)->index)
(*arr)->index=index;

if(index<(*arr)->size)
{
if( ((*arr)->item[index][0])!=NULL&&((*arr)->item[index][1])!=NULL)
{
Free((*arr)->item[index][0]);
(*arr)->item[index][1]=NULL;
}
(*arr)->item[index][0]=value;
}
else
{
ArrayAddSize(arr,ArrayPerAddSize);
ArraySet(arr,index,value);
}
}
/*
*功能:设置给定数组的给定索引处的值
*声明:添加堆的数据到指定的Index处。函数有可能改变原有内存位置,用新的内存来代替,所以参数需要数组的指针地址
* 如果Index大于容器体积,那么他会增加递归调用,只要满足能够让index包含,如果给定Index处已经有了堆分配的数据
* 那么先释放数据,然后才设定新数据
*参数: arr:给定的数组指针地址 index:要设置项的索引 value:设定的值
*返回:void
*/
void SetArray(Array ** arr,int index,void * value)
{

if(index>(*arr)->index)
(*arr)->index=index;

if(index<(*arr)->size)
{
//如果这个位置已经有了数据,并且数据为堆的数据,那么释放他
if( ((*arr)->item[index][0])!=NULL&&((*arr)->item[index][1])!=NULL)
{
Free((*arr)->item[index][0]);
(*arr)->item[index][1]=NULL;
//这里本来有数据,结果被重置了,并且没有发出警报
}
(*arr)->item[index][0]=value;
(*arr)->item[index][1]=value;
}
else
{
ArrayAddSize(arr,ArrayPerAddSize);
SetArray(arr,index,value);
}


}
/*
*功能:向指定数组最后增加一个值,若数组容量不够就会重新申请更大的容积数组,然后拷贝数据再加入新的
*声明:value必须为栈中的数据,Array函数不提供统一释放栈项内容,函数有可能改变原有
* 内存位置,用新的内存来代替,所以参数需要数组的指针地址
*参数:arr:给定的数组指针地址 value:设定的值
*返回:void
*/
void ArrayAdd(Array ** arr,void * value)
{
if ((*arr)->index >= (*arr)->size)
ArrayAddSize(arr, ArrayPerAddSize);

(*arr)->item[(*arr)->index][0] = value;
(*arr)->index++;
}

/*
*功能:向指定数组最后增加一个值,若数组容量不够就会重新申请更大的容积数组,然后拷贝数据再加入新的
*声明:alue必须是堆中申请的内存,不然函数有可能改变原有内存位置,用新的内存来代替,所以参数需要数组的指针地址
*参数:arr:给定的数组指针地址 value:设定的值
*返回:void
*/
void AddArray(Array ** arr, void * value) {

if ((*arr)->index >= (*arr)->size)
ArrayAddSize(arr, ArrayPerAddSize);
(*arr)->item[(*arr)->index][0] = value;
//数据为堆的数据,需要显示释放,用这个指针来标识
(*arr)->item[(*arr)->index][1] = value;
(*arr)->index++;

}
/*
*功能:增加指定数组的容两量
*声明:有可能引起新内存申请,内存拷贝,从而改变指针具体指向
*参数:arr:要操作的数组指针地址 size:要增加的数量
*返回:数组指针
*/
Array * ArrayAddSize(Array ** arr,int size)
{
Array * arrr=(Array *)New(((*arr)->size+size)*2*(sizeof(void *))+sizeof(Array));
arrr->size=(*arr)->size+size;
int i;
for(i=0;i<arrr->size;i++)
{
if(i<(*arr)->size)
{
arrr->item[i][0]=(*arr)->item[i][0];
arrr->item[i][1]=(*arr)->item[i][1];
}
else
{
arrr->item[i][0]=NULL;
arrr->item[i][1]=NULL;
}
}
(arrr->index)=((*arr)->index);
Free(*arr);
*arr=arrr;
return arrr;
}
/*
*功能:返回指定数组的容积大小
*参数:arr:指定数组
*返回:容积大小
*/
int ArraySize(Array * arr)
{
return arr->size;
}
/*
*功能:释放指定数组内存
*参数:arr:指定数组
*返回:void
*/
void ArrayFree(Array * arr)
{
int i;
for(i=0;i<arr->size;i++)
{
if((arr->item[i][0]!=NULL)&&(arr->item[i][1]!=NULL))
{
Free(arr->item[i][0]);
}
}
Free(arr);
}
/*
*公能:数组功能测试
*参数:void
*返回:void
*/
void ArrayTest()
{
Array *arr=ArrayNew();
int i=0;
//测试从堆分配内存放入数组中
char *tmp=(char *)New(1200);
AddArray(&arr,tmp);
//测试从同一个位置多次次设置
char *tmp1=(char *)New(1200);
ArraySet(&arr,0,"ergreg");
char *tmp2=(char *)New(1200);
SetArray(&arr,0,tmp2);
//测试多次Add和Get
for(i=3;i<100;i++)
{
ArrayAdd(&arr,"ok ");
printf("第%i项结果为%s,Index为%d:size为:%d\n",i,ArrayGet(arr,i),arr->index,arr->size);
}
ArrayFree(arr);
}


arrays.h

/*
* File: arrays.h:动态数组函数头文件
* 声明:此函数功能不具备线程安全性,所以在使用过程中不建议用于公共变量,建议在函数内部使用
* 所有以Array开头的函数说明参数内存为栈,所有以Array结尾的函数说明参数内存为堆
* 所有传入数组的堆内存,一旦调用FreeAray或者于内存操作相关的函数就会将其全部释放,不需要逐个释放
* Author: netpet
* Flower net server
* 本程序是为一体化web server产品专用设计,具有部分代码为具体产品优化而不代表普遍通用性的特性
* 程序在linux 2.46下调试通过,编辑工具netbeans 6.1 for c
* 联系方式:Email:netpetboy@163.com QQ:51977431
* Created on 2008年5月29日, 上午10:44
*/

#ifndef _ARRAYS_H
#define _ARRAYS_H

#ifdef __cplusplus
extern "C" {
#endif

#define DefaultArraySize 10/**默认没有设置初始化大小时的大小*/
#define ArrayPerAddSize 5 /**每次不够用时增加多少项,大于1可能会引起size失真(略大于实际值)*/
#define GetArray(type,arr,index) ((type *)ArrayGet(arr,index))
typedef struct _arrays Array;

struct _arrays {
int size; /*总大小*/
int index; /**当前赋值项索引*/
void * item[1][2];
};
/*
*功能:实现一个Array结构体的初始化,能够包含DefaultArraySize大小个项目,每一个数组项需要重新内存分配
* 不接受非内存动态分配对象(栈上的数据,比如临时申请的字符串),否则会引起错误(函数在返回后可能就不存在了)
*参数:void
*返回:Array结构体
*/
extern Array * ArrayNew();
/*
*功能:实现一个Array结构体的初始化,容量为给定的size
*参数:size:容器大小
*返回:Array数组
*/
extern Array * NewArray(int size);
/*
*功能:返回给定数组指定索引处的值,索引以0开头
*参数:arr:给定的结构体,index:索引
*返回:void指针,如果为空或者给定Index大于数组的最大长度就返回NULL
*/
extern void * ArrayGet(Array * arr,int index);
/*
*功能:设置给定数组的给定索引处的值
*声明:添加栈的数据到Array中。函数有可能改变原有内存位置,用新的内存来代替,所以参数需要数组的指针地址
* 如果Index大于容器体积,那么他会增加递归调用,只要满足能够让index包含
*参数: arr:给定的数组指针地址 index:要设置项的索引 value:设定的值
*返回:void
*/
extern void ArraySet(Array ** arr,int index,void * value);
/*
*功能:设置给定数组的给定索引处的值
*声明:添加堆的数据到指定的Index处。函数有可能改变原有内存位置,用新的内存来代替,所以参数需要数组的指针地址
* 如果Index大于容器体积,那么他会增加递归调用,只要满足能够让index包含,如果给定Index处已经有了堆分配的数据
* 那么先释放数据,然后才设定新数据
*参数: arr:给定的数组指针地址 index:要设置项的索引 value:设定的值
*返回:void
*/
extern void SetArray(Array ** arr,int index,void * value);
/*
*功能:向指定数组最后增加一个值,若数组容量不够就会重新申请更大的容积数组,然后拷贝数据再加入新的
*声明:value必须为栈中的数据,Array函数不提供统一释放栈项内容,函数有可能改变原有
* 内存位置,用新的内存来代替,所以参数需要数组的指针地址
*参数:arr:给定的数组指针地址 value:设定的值
*返回:void
*/
extern void ArrayAdd(Array ** arr,void * value);
/*
*功能:向指定数组最后增加一个值,若数组容量不够就会重新申请更大的容积数组,然后拷贝数据再加入新的
*声明:alue必须是堆中申请的内存,不然函数有可能改变原有内存位置,用新的内存来代替,所以参数需要数组的指针地址
*参数:arr:给定的数组指针地址 value:设定的值
*返回:void
*/
extern void AddArray(Array ** arr, void * value);
/*
*功能:增加指定数组的容两量
*声明:有可能引起新内存申请,内存拷贝,从而改变指针具体指向
*参数:arr:要操作的数组指针地址 size:要增加的数量
*返回:数组指针
*/
extern Array * ArrayAddSize(Array ** arr,int size);
/*
*功能:返回指定数组的容积大小
*参数:arr:指定数组
*返回:容积大小
*/
extern int ArraySize(Array * arr);
/*
*功能:释放指定数组内存
*参数:arr:指定数组
*返回:void
*/
extern void ArrayFree(Array * arr);
/*
*公能:数组功能测试
*参数:void
*返回:void
*/
extern void ArrayTest();


#ifdef __cplusplus
}
#endif

#endif /* _ARRAYS_H */

分享到:
评论

相关推荐

    单片机的C语言中数组的用法(转) (附原创源码)

    总结,单片机的C语言中数组的使用涉及到静态和动态数组的概念,动态数组通过`malloc()`和`free()`函数实现内存动态分配和释放,从而提高了代码的灵活性。在实现任意数排序时,可以选用合适的排序算法,并结合动态...

    AT89S52单片机C语言 用数组作函数参数控制流水花样(002).rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累... 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。

    AT89S52单片机C语言 用数组作函数参数控制流水花样(001).rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累... 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。

    AT89S52单片机C语言 用数组的指针控制P0 口8 位LED流水点亮.rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累... 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。

    C语言和汇编语言的混合编程例子

    在C语言程序中定义一整形数组,输入数组的各个元素;用汇编语言子程序求数组元素的平均值及小于此值的元素个数。最后在C程序中显示平均值和小于此值的元素个数。 郑旅军原创,谢绝抄袭!!

    大一原创C语言学生信息管理系统1.0项目源代码压缩包

    《大一原创C语言学生信息管理系统1.0项目源代码解析》 本项目是一个基于C语言的学生信息管理系统,旨在帮助初学者理解C语言在实际应用中的功能和结构,以及如何利用编程解决实际问题。该系统可能包含了一系列的C源...

    原创经典C语言涡形数列

    ### 原创经典C语言涡形数列 #### 知识点概述 本文将详细介绍一个用C语言实现的经典程序——“涡形数列”(也称为螺旋矩阵)。该程序根据用户输入的一个正整数n,输出一个n×n的矩阵,其中数字按照顺时针方向螺旋...

    VB自定义数组类

    在标题提到的"VB自定义数组类"中,作者实现了一个原创的数组类,旨在提供类似于C语言数组的功能,但增加了更多的灵活性和便利性。下面我们将深入探讨这个自定义数组类可能包含的关键知识点。 1. **动态类型...

    C语言讲义_第二章_数组、指针与其它功能函数

    理解指针的使用对于深入掌握C语言至关重要,因为许多高级功能,如动态内存分配、函数指针和回调函数等,都离不开指针的运用。 综上所述,C语言中的数组和指针是编程中的基本工具。数组提供了一种高效的数据存储方式...

    c语言原创趣味试题(2)难度比第一次的加大了一些

    这道题考察了C语言的数组操作、循环以及条件判断。 3. **海报重叠面积计算**: 题目要求计算两张矩形海报的重叠部分面积。首先,读取每张海报的坐标,然后根据坐标计算两者的交集。可以使用矩形的边界条件来确定...

    AT89S52单片机C语言 用指针数组作为函数的参数显示多个字符串.rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累... 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。

    AT89S52单片机C语言 用指针数组控制P0口8位LED流水点亮.rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累... 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。

    DES加密算法的原创C语言程序

    1. **数据结构和定义**:定义64位的明文、密文和密钥数据结构,以及用于存储S盒和P盒的数组。 2. **预处理**:处理密钥,将其转化为48位子密钥序列。 3. **加密过程**:实现上述的16轮迭代过程,包括子密钥生成、...

    C语言课堂App【免费C语言学习交流】

    1、免费提供C语言学习及基础、条件结构、循环、数组、函数、指针等相关文字和视频教程,所有内容均属团队原创作品,版权所有,请勿转载; 2、支持【手机C语言编程】 3、将复杂的C语言基础和编程技能,通过生活化...

    Viterbi译码的C语言源代码(原创)

    2. **维特比表**:定义二维数组或链表结构来存储每个时刻每个状态的信息。 3. **动态编程**:编写一个循环,遍历输入码流,根据卷积编码规则计算每个状态的转移概率,并更新维特比表。 4. **路径选择**:实现一个...

    大一C语言实训20个任务(原创)

    7. **字符串处理**:C语言使用字符数组来表示字符串,字符串以空字符'\0'结尾。实训可能涵盖字符串复制、比较、查找子串等操作。 8. **结构体与联合体**:结构体是不同类型数据的组合,联合体则是共享同一块内存的...

    贪吃蛇源代码(C语言版,绝对原创)

    - 使用康威生活法则(Conway's Game of Life)中的类似技巧更新屏幕,实现游戏元素的动态显示。 - ASCII艺术:利用ASCII码绘制蛇、食物等游戏元素。 3. **数组与结构体** - 数组用于存储蛇的身体位置,每次移动...

    《基于c语言的流行病传播模型》个人原创课程设计

    在这个个人原创的设计中,可视化效果也是一个亮点。这通常意味着我们需要集成图形用户界面(GUI)来展示结果。在C语言中,可以利用如OpenGL、SDL或GTK+等库来创建图形界面,实时显示城市中不同状态人群的数量。通过...

    C语言五子棋代码 支持鼠标操作

    1. **C语言基础**:复习变量、数据结构(如二维数组)、控制流程(循环、条件语句)等基础知识。 2. **图形编程**:了解BGI库的工作原理,如何使用其提供的函数来创建棋盘和处理用户输入。 3. **游戏算法**:学习并...

    【原创】C语言简易通讯录

    包含以下几个功能 1.增加联系人信息(姓名,地址,邮编,Email,qq,手机号码) 2.查找功能 3.删除联系人 4.修改联系人信息 5.退出 用命令行界面数组保存 不包含链表、文件保存!!

Global site tag (gtag.js) - Google Analytics