dynamic.h文件如下:
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct dynamicarr {
void** parr;
int size;
int capcity;
}Dyarr;
void* initdynamicarr(int capcity);
void foreachdynamicarr(void* array, int myprint(void* posi));
void insertdynamicarr(void* array, int pos, void* data);
void deletedynamic(void* array, int posi);
void destorydnamicarr(void* array);
void dynamicarrinfo(void* array);
dynmaic.c文件如下:
#include "dynamicarr.h"
/*typedef struct dynamicarr {
void** parr;
int size;
int capcity;
}dyarr;*/
int myprint(void* posi);
//初始化
void * initdynamicarr(int capcity) {
if (capcity==NULL)
{
return NULL;
}
Dyarr* arr = malloc(sizeof(dyarr));
if (arr==NULL)
{
return NULL;
}
arr->parr = malloc(sizeof(void*) * capcity);
arr->capcity = capcity;
arr->size = 0;
return arr;
}
//遍历;
void foreachdynamicarr(void* array,void myprint(void *posi)) {
Dyarr* arr = array;
if (arr->size <= 0)
return NULL;
for (int i = 0; i < arr->size; i++)
{
myprint(arr->parr[i]);
}
}
//插入
void insertdynamicarr(void* array, int pos, void* data) {
Dyarr* arr = array;
if (arr == NULL)
{
return;
}
if (pos<0|pos>arr->capcity|pos>arr->size)
{
pos = arr->size;
}
if (arr->size == arr->capcity)
{
//arr=initdynamicarr(arr->capcity * 2);
int newcapcity = arr->capcity * 2;
void** newspace = malloc(sizeof(void*) * newcapcity);
memcpy(newspace, arr->parr, sizeof(void*) * arr->capcity);
free(arr->parr);
arr->parr = newspace;
arr->capcity = newcapcity;
}
for (int i = arr->size-1; i >=pos; i--)
{
arr->parr[i+1] = arr->parr[i];
}
arr->parr[pos] = data;
arr->size++;
}
//删除
void deletedynamic(void* array, int posi) {
Dyarr* arr = array;
if (arr==NULL)
{
return;
}
if (arr->size==0|posi>arr->size)
{
return NULL;
}
for (int i =posi-1; i <arr->size-2; i++)
{
memcpy(arr->parr[i], arr->parr[i + 1], sizeof(void*));
}
arr->parr[arr->size - 1] = -1;
arr->size--;
}
//销毁
void destorydnamicarr(void* array) {
Dyarr* arr = array;
if (arr==NULL|arr->parr==NULL)
{
return;
}
free(arr->parr);
arr->parr == NULL;
free(arr);
arr = NULL;
}
void dynamicarrinfo(void* array) {
Darr* arr = array;
printf("size=%d,capcity=%d\n", arr->size, arr->capcity);
return;
}
测试代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "dynamicarr.h"
//typedef struct dynamicarr {
// void** parr;
// int size;
// int capcity;
//};
typedef struct Person {
char name[64];
int age;
}Per;
void myprint(void *posi) {
Per *pos = posi;
printf("name:%s age:%d\n", pos->name,pos->age);
}
int main()
{
int capcity = 5;
void** arraymain = initdynamicarr(capcity);
Per arr[5] = {
{"一",18},
{"二",19},
{"三",20},
{"四",17},
{"五",13}
};
printf("%d\n", &arr[2] - &arr[1]);
printf("before insert\n");
dynamicarrinfo(arraymain);
int len = sizeof(arr) / sizeof(Per);
//printf("%d\n",len);
for (int i = 0; i < len; i++)
{
insertdynamicarr(arraymain, i, ((Per*)arr + i)/*&arr[i]*/);
}
printf("after insert\n");
dynamicarrinfo(arraymain);
printf("--------------\n");
foreachdynamicarr(arraymain, myprint);
printf("--------\n");
Per num[2] = {
{"tom",29},
{"jack",28}
};
for (int i = 0; i < 2; i++)
{
*** insertdynamicarr(arraymain, i, ((Per*)num + i)/*&arr[i]*/);
}
foreachdynamicarr(arraymain, myprint);
printf("after delete:\n");
deletedynamic(arraymain, 2);
foreachdynamicarr(arraymain, myprint);
printf("%d\n", *arraymain);
destorydnamicarr(arraymain);
printf("%d\n", *arraymain);
system("pause");
return 0;
}
插入后输出数据不完整,调试时发现在输出第二个数据时出现中断,报错为:引发了异常: 读取访问权限冲突,传参时出现问题
此时发现测试函数***处代码为:
insertdynamicarr(arraymain, i, **arr+i*sizeof(Per)**);
后修改为:
insertdynamicarr(arraymain, i, **((Per*)num + i)/*&arr[i]*/**);
此时包括注释的方式输出结果都正确
作为使用指针函数和动态数组结合的练习,在函数参数传递方面要仔细。