zoukankan      html  css  js  c++  java
  • 一维指针作函数参数,与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");
    }


  • 相关阅读:
    487-3279(电话号码)
    【模板】二分图匹配
    【模板】网络最大流
    P3879 [TJOI2010]阅读理解
    10.10 考试T1 低仿机器人
    P4025 [PA2014]Bohater
    线段树合并 从入门到入土
    CF547B Mike and Feet
    10.6洛谷月赛划水记
    P4552 [Poetize6] IncDec Sequence
  • 原文地址:https://www.cnblogs.com/lzq1126/p/5596838.html
Copyright © 2011-2022 走看看