一维指针作函数参数,与malloc需要手动释放




#include<stdio.h>
#include<stdlib.h>
void GetMemory1(char*p, int num)
{
	p = (char*)malloc(sizeof(char)*num);
}
void GetMemory2(char**p, int num)
{
	*p = (char*)malloc(sizeof(char)*num);
}

char* GetMemory3(char*p, int num)
{
	p = (char*)malloc(sizeof(char)*num);
	return p;
}
char* GetMemory4(void)
{
	char p[] = "hello world";
	return p;
}


int main()
{
	

		char* str1 = NULL;
		char* str2 = NULL;
		char* str3 = NULL;
		char* str4 = NULL;
		GetMemory1(str1,100);
		GetMemory2(&str2, 100);
		str3 = GetMemory3(str3, "hellow");
		str4 = GetMemory4();

		//strcpy(str1, "hello");
		//printf("%s
", str1);       
		//无法输出,将str1的地址拷贝到p中,p虽然分配完内存空间,
		//但是在在函数结束时p被释放,str1只有一个空间,所以str1越界

		/*strcpy(str2, "hello");
		printf("%s
", str2);*/
		//可以输出hello,因为传递的是&str2值(将str2的地址拷贝到给p)
		//函数执行完毕后,p虽然释放但是p指向的对象(str2)已经被分配完内存空间

		/*strcpy(str3, "hello");
		printf("%s
", str3);*/
		//返回的地址,相当于拷贝给str3,所以str3实际已经有100个空间。
		
		printf("%s
", str4);
		//输出乱码,因为函数执行完毕后,函数GetMemory4()中的数组空间
		//被释放,所以str4这个指针指向的内容是乱码,vs2015编译器是
		//烫烫烫,内存是cc cc cc cc cc cc cc cc 四个c对应中文烫
		//与第三个GetMemory3()对比,因为malloc分配的内存空间再函数
		//结束后如果不free是不会被释放的。所以可以输出hello。
		system("pause");
}


原文地址:https://www.cnblogs.com/lzq1126/p/5596838.html