• 一维指针作函数参数,与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");
    }


  • 相关阅读:
    数据库备份,全备份、增量备份与恢复
    虚拟机扩容---续集(热扩容)
    虚拟机扩容
    Linux下R环境安装
    OLAP、OLTP的介绍CBO/RBO
    CRC校验(转)
    产品经理必读的30本书单(转)
    xcode6 下 ios simulator 有 Home 键么?
    如果我可以重新学习iOS开发(转)
    按位与、或、异或等运算方法(转)
  • 原文地址:https://www.cnblogs.com/lzq1126/p/5596838.html
Copyright © 2020-2023  润新知