二级指针作为输入__在函数内部分配内存

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int demo(void)
{
	char *p0 = NULL; 
	p0 = (char *)malloc(100);
	strcpy(p0, "agdsgds");

	//10个char *, 每一个的值都是空
	int i = 0;
	char *p[10] = { 0 };
	for (i = 0; i < 10; i++)
	{
		p[i] = malloc(100);
		strcpy(p[i], "agdsg");
	}

	int a[10];
	int *q = (int *)malloc(10 * sizeof(int)); //q[10]


	//动态分配一个数组,每个元素都是char *
	//char *ch[10]
	int n = 3;
	char **buf = (char **)malloc(n * sizeof(char *)); //char *buf[3]
	if (buf == NULL)
	{
		return -1;
	}
	for (i = 0; i < n; i++)
	{
		buf[i] = (char *)malloc(30 * sizeof(char));
		char str[30];
		sprintf(str, "test%d%d", i, i);
		strcpy(buf[i], str);
	}

	for (i = 0; i < n; i++)
	{
		printf("%s, ", buf[i]);
	}
	printf("\n");

	for (i = 0; i < n; i++)
	{
		free(buf[i]);
		buf[i] = NULL;
	}

	if (buf != NULL)
	{
		free(buf);
		buf = NULL;
	}

	return 0;
}

char **getMem(int n)
{
	int i = 0;
	char **buf = (char **)malloc(n * sizeof(char *)); //char *buf[3]
	if (buf == NULL)
	{
		return NULL;
	}
    
	for (i = 0; i < n; i++)
	{
		buf[i] = (char *)malloc(30 * sizeof(char));
		char str[30];
		sprintf(str, "test%d%d", i, i);
		strcpy(buf[i], str);
	}

	return buf;
}

void print_buf(char **buf, int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%s, ", buf[i]);
	}
	printf("\n");
}


void free_buf(char **buf, int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		free(buf[i]);
		buf[i] = NULL;
	}

	if (buf != NULL)
	{
		free(buf);
		buf = NULL;
	}

}

int main(int argc, const char * argv[])
{
	char **buf = NULL;
	int n = 3;

	buf = getMem(n);
	if (buf == NULL)
	{
		printf("getMem err\n");
		return -1;
	}

	print_buf(buf, n);

	free_buf(buf, n);
	buf = NULL;

	return 0;
}

测试结果

在这里插入图片描述

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

//先分配5个char * 类型的指针,然后再让每一个char *类型的指针指向一个100字节的内存空间
char **getMem(int num)
{
	int i = 0;
	char **p2 = NULL;
	p2 = (char **)malloc(sizeof(char *) * num);
	if (p2 == NULL)
	{
		return NULL;
	}

	for (i=0; i<num; i++)
	{
		p2[i] = (char *)malloc(sizeof(char)  * 100  ); //char buf[100];
		sprintf(p2[i], "%d%d%d", i+1, i+1, i+1);
	}
	return p2;
}

void printMyArray(char **myArray, int num)
{
	int i = 0;
    
	if (myArray == NULL)
	{
		return ;
	}
    
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s \n", *(myArray+i) );
	}
}

#if 0

void sortMyArray(char **myArray, int num)
{
	int i =0 , j = 0;
    
	if (myArray == NULL)
	{
		return ;
	}
	char *tmp = NULL;
	//排序
	for (i=0; i<num; i++)
	{
		for (j=i; j<num; j++)
		{
			if (strcmp(myArray[i], myArray[j]) < 0 )
			{
				tmp = myArray[i];  //交换的是数组元素 交换的是指针的值 //改变指针的指向
				myArray[i] = myArray[j];
				myArray[j] = tmp;
			}
		}
	}
}

#else

void sortMyArray(char **myArray, int num)
{
	int i =0 , j = 0;
    
	if (myArray == NULL)
	{
		return ;
	}
	char tmp[100] = { 0 };//在栈区分配临时空间
	memset(tmp, 0, sizeof(tmp));
	//排序
	for (i=0; i<num; i++)
	{
		for (j=i; j<num; j++)
		{
			if (strcmp(myArray[i], myArray[j]) < 0 )
			{
				strcpy(tmp, myArray[i]);  // 交换的是指针指向的内存空间
				strcpy(myArray[i], myArray[j]);
				strcpy(myArray[j], tmp);
			}
		}
	}
}

#endif

void getMem_Free(char **p2, int num)
{
	int i = 0;
	//释放内存
	for(i=0; i<num; i++)
	{
		if (p2[i] != NULL)
		{
			free(p2[i]);
			p2[i] = NULL;
		}
	}

	if (p2!=NULL) 
	{
		free(p2);
	}

}


int main(int argc, const char * argv [])
{
	int i = 0, j = 0;
	char **p2 = NULL;
	int num = 5;
	char *tmp = NULL;
	char tmpbuf[100];
	p2 = getMem(num);
    
	if (p2 == NULL)
	{
		return -1;
	}
    
	printf("before sort:\n");
	printMyArray(p2, num);

	sortMyArray(p2, num);

	printf("after sort:\n");
	printMyArray(p2, num);

	getMem_Free(p2,  num); //p2是一个野指针
	if(p2 != NULL)
	{
        
    	printf("pointer p2 ok!\n");
        p2 = NULL;
    }
	
	return 0;
}


测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值