二级指针在子函数中申请内存的两种方式

二级指针:在主函数中申明变量,在子函数中分配内存,有两种方式返回二级指针。在这个过程只有深刻理解了C的函数调用模型,以及指针的内存模型,才能够掌握好。

#pragma once
#include <iostream>
#include <string>

using namespace std;

//二级指针通过返回值的方式返回
char ** sortArray1Array2(char **array1, int count1, char(*array2)[30], int count2, int * totalNum)
{
	*totalNum = count1 + count2;
	char **p = (char**)malloc((*totalNum) * sizeof(char*));

	if (p == NULL)
	{
		throw exception("申请内存出现错误");
	}

	for (int i = 0; i < *totalNum; i++)
	{
		p[i] = (char*)malloc(30 * sizeof(char));
		if (p[i] == NULL)
		{
			throw exception("申请内存错误");
		}
	}

	for (int i = 0; i < count1; i++)
	{
		strcpy_s(p[i], 30, array1[i]);
	}

	for (int i = 0; i < count2; i++)
	{
		strcpy_s(p[count1 + i], 30, array2[i]);
	}

	char *tmp = NULL;

	for (int i = 0; i < *totalNum; i++)
	{
		for (int j = i + 1; j < *totalNum; j++)
		{
			if (strcmp(p[i], p[j]) > 0)
			{
				tmp = p[i];
				p[i] = p[j];
				p[j] = tmp;
			}
		}
	}
	return p;
}

//二级指针通过函数参数3级指针的方式返回;传入的时候需要传入的是变量的地址
int sortArray1Array2(char **array1, int count1, char(*array2)[30], int count2, char ***array3)
{
	int totalNum = count1 + count2;
	char **p = (char**)malloc((totalNum) * sizeof(char*));
	*array3 = p;

	if (p == NULL)
	{
		throw exception("申请内存出现错误");
	}

	for (int i = 0; i < totalNum; i++)
	{
		p[i] = (char*)malloc(30 * sizeof(char));
		if (p[i] == NULL)
		{
			throw exception("申请内存错误");
		}
	}

	for (int i = 0; i < count1; i++)
	{
		strcpy_s(p[i], 30, array1[i]);
	}

	for (int i = 0; i < count2; i++)
	{
		strcpy_s(p[count1 + i], 30, array2[i]);
	}

	char *tmp = NULL;

	for (int i = 0; i < totalNum; i++)
	{
		for (int j = i + 1; j < totalNum; j++)
		{
			if (strcmp(p[i], p[j]) > 0)
			{
				tmp = p[i];
				p[i] = p[j];
				p[j] = tmp;
			}
		}
	}
	return totalNum;
}

void freePtr(char ** array1, int arrayNum)
{
	for (int i = 0; i < arrayNum; i++)
	{
		free(array1[i]);
	}

	free(array1);
}

void test()
{
	int i = 0;
	char ** pArray3 = NULL;
	int nArray3Num = 0;
	//指针数组
	char * array1[] = { "bbbbbb", "aaaa", "cccccc", "2222", "1111111111", "444444" };

	//二维数组
	char array2[10][30] = { "zzzzzz", "yyyyyy", "3333333333" };

	pArray3 = sortArray1Array2(array1, 6, array2, 3, &nArray3Num);

	nArray3Num = sortArray1Array2(array1, 6, array2, 3, &pArray3);

	for (int i = 0; i < nArray3Num; i++)
	{
		cout << pArray3[i] << endl;
	}

	if (pArray3 != NULL)
	{
		freePtr(pArray3, nArray3Num);
		pArray3 = NULL;
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值