动态数组学习中遇到的问题

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]*/**);
此时包括注释的方式输出结果都正确

作为使用指针函数和动态数组结合的练习,在函数参数传递方面要仔细。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值