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


  • 相关阅读:
    JS pop push unshift shift的作用与区别
    白话js this指向问题
    JS作用域,作用域,作用链详解
    angular $q promise详解
    白话$resource,$resource中的增删改查
    ng-app与ng-app='myApp'的区别
    详解 高效字节流
    详解 字节输出流 与 字节输入流
    阶段性复习与应用——复制多级文件夹
    详解 字节流
  • 原文地址:https://www.cnblogs.com/lzq1126/p/5596838.html
Copyright © 2011-2022 走看看