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");
    }


  • 相关阅读:
    『Linux学习笔记』0. 在Windows中运行Linux内核(Ubuntu)
    『Linux学习笔记』10. 文本编辑器
    『Linux学习笔记』9. 进程
    九种乱码解决办法(非原创)
    Eclipse中10个最有用的快捷键组合
    MVC(Model View Controller)框架
    ognl表达式
    统计一段文字中数组、中文、英文字母、空格以及其他特殊字符出现的次数
    java基础知识4
    java基础知识3
  • 原文地址:https://www.cnblogs.com/lzq1126/p/5596838.html
Copyright © 2011-2022 走看看