c语言之多级指针的应用

/*
	功能: 1、把指针数组p1的字符串取出来,
		  2、把二维数组buf2的字符取出来,
		  3、上面的字符串放在 p3,p3 是在堆区指针数组(每个元素同时又指向堆区)
		  4、对 p3 中字符串进行排序,通过 strcmp() 进行排序
	参数:
		p1: 指针数组首地址,char *p1[] = {"aa", "ccccccc", "bbbbbb"};
		len1:p1元素个数
		buf2:二维数组首元素地址,char buf2[][30] = {"111111", "3333333", "222222"};
		len2:buf2字符串的行数
		p3:二级指针的地址,需要在函数内分配堆区指针数组,保存p1和buf2的字符串,还需要排序
		len3:保存p3中的字符串个数
	返回值:成功为0, 失败为负数
	*/

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include 
#define false 0
#define true 1
/*int sort(char **array1, int num1, char (*array2)[30], int num2, char ***myp3 /*out, int *num3);*/

int sort(char **p1,int len1, char (*mPtr)[30], int len2, char ***p3, int *len3)
{
   int i,j,k;
   int len = len1+len2;
   for (i=0;i<len1;i++)
   {
     printf ("p1[%d] = %s\n",i,p1[i]);
   }

   for (j=0;j<len2;j++)
   {
     printf ("mPtr[%d] = %s\n",j,mPtr[j]);
   }

    *p3 = (char **)malloc (sizeof(char*)*len);
	printf("-----%p\n",*p3);
   //p3 = (char **)malloc (sizeof(char*)*len);

  if (*p3 == NULL)
  {
    return false;
  }

  for (k=0;k<len1;k++)
  {
    (*p3)[k] = (char *)malloc (strlen (p1[k])+1);
	if ((*p3)[k] == NULL)
	{
	   return -1;
	}
	strcpy ((*p3)[k],p1[k]);
  }

  for (k=3;k<len2+3;k++)
  {
     (*p3)[k]=(char*)malloc (strlen(mPtr[k-3])+1);
	if ((*p3)[k]==NULL)  
	{
	 return -1;
	}
	strcpy ((*p3)[k],mPtr[k-3]);
	//printf("----%s-----\n",mPtr[k]);
  }
  *len3=len;
   return 1;
}


/*****打印元素******/

void printBuf(char **p3, int len3)
{
   int i;
   for(i=0;i<len3;i++)
   {
     printf("%s",p3[i]);
   }
}

 /********释放内存空间**********/
 
void free_buf(char ***p3, int len3)
{
  if (p == NULL)
	{
		return;
	}

	char **tmp = *p; //还原二级指针
	int i = 0;
	for (i = 0; i < n; i++)
	{
		if (tmp[i] != NULL)
		{
			free(tmp[i]);
			tmp[i] = NULL;
		}
	}

	if (tmp != NULL)
	{
		free(tmp);
		*p = NULL;
	}
}

int  main()
	{
	int ret = 0; 
	char *p1[] = {"aa", "ccccccc", "bbbbbb"};
	char buf2[][30] = {"111111", "3333333", "222222"};
	char **p3 = NULL;   
	int len1, len2, len3, i = 0;

	len1 = sizeof(p1)/sizeof(*p1);
	len2 = sizeof(buf2)/sizeof(buf2[0]);

	ret = sort(p1,len1,buf2,len2, &p3,&len3);

	//打印内容
	printf("-----%p\n",p3);
	printBuf(p3, len3);
	
	//释放p3所指向内存
	//在函数内部把p3的值赋值为NULL
	//len3:保存p3中的字符串个数
    //free_buf(&p3, len3);

	system("pause");
	return 0;

  }

你可能感兴趣的:(C语言)