C语言动态数组实现,含代码
这本来是非常基础的东西,其实它就是一个指针而已,搞得好像很神秘似的。
但如果能写一套接口去维护这个指针,就会显得动态数组有点学习的价值,今天有一哥们自学C语言,听课听到动态
数组,跟我交流了一下作业, 于是产生了如下代码,供有兴趣的同学们查阅。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef enum
{
true,
false
}BOOL;
typedef struct
{
int *pArray;
int size;
}ARRAY;
BOOL array_ctor(ARRAY *p, int size)
{
if (!p)
return false;
p->pArray = (int *)malloc(size);
if (p->pArray) {
p->size = size;
return true;
} else {
return false;
}
}
BOOL array_dtor(ARRAY *p)
{
if (!p)
return false;
free(p->pArray);
p->pArray = NULL;
return true;
}
int array_size(ARRAY const *p)
{
if (!p)
return (int)false;
return p->size;
}
int * array_at(ARRAY const *p, int index)
{
if (!p)
return NULL;
return &p->pArray[index];
}
BOOL array_inflate(ARRAY *p, int size)
{
if (!p)
return false;
p->pArray = (int *)realloc(p->pArray, p->size + size);
if (p->pArray) {
p->size += size;
return true;
} else {
return false;
}
}
int main(int argc, char *argv[])
{
int i = 0;
ARRAY test;
int *p = NULL;
/*测试array_ctor函数*/
array_ctor(&test, sizeof(int) * 10);
printf("array_ctor之后数组地址为0x%p\n", test.pArray);
for (i = 0; i < 10; i++)
test.pArray[i] = i + 1;
for (i = 0; i < 10; i++)
printf("%d ", test.pArray[i]);
printf("\n");
/*测试array_size函数*/
printf("数组占内存空间的大小为%d\n", array_size(&test));
/*测试array_at函数*/
p = array_at(&test, 5);
printf("数组中索引为5的元素值为%d\n", *p);
/*
以上两句话等价于下面这一句话
printf("数组中索引为5的元素值为%d\n", array_at(&test, 5)[0]); 或者
printf("数组中索引为5的元素值为%d\n", *array_at(&test, 5));
*/
/*测试array_inflate函数*/
array_inflate(&test, sizeof(int) * 5);
printf("array_inflate之后数组地址为0x%p\n", test.pArray);
for (i = 10; i < 15; i++)/*注意i的初始值*/
test.pArray[i] = i + 1;
for (i = 0; i < 15; i++)
printf("%d ", test.pArray[i]);
printf("\ninflate之后数组占内存空间的大小为%d\n", array_size(&test));
/*测试array_dtor函数*/
array_dtor(&test);
if (test.pArray == NULL)
printf("free success\n");
else
printf("free failed\n");
return 0;
}