zoukankan      html  css  js  c++  java
  • 关于内存分配的几个例子

    1. 

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void GetMemory(char *p);
    
    void Test();
    
    int main()
    {
    	Test();
    	return 0;
    }
    
    void GetMemory( char *p )
    {
    	p = (char *) malloc( 100 );
    }
    
    void Test( void )
    {
    	char *str = NULL;
    	GetMemory( str );
    	strcpy( str, "hello world" );
    	printf(str);
    }
    分析:

    在VS2010上编译可以通过,但是不能运行。

    个人理解:

    运行GetMemory()时,p是str的一个副本。虽然分配的空间没有被销毁,但是GetMemory只是让p指向分配好的空间,而没有让Test中的str也指向malloc分配的内存

    所以不能运行。

    Test中,str初始化为NULL(不再是野指针了),因此,strcpy可以通过编译。


    2. 

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void GetMemory(char *p);
    
    void Test();
    
    int main()
    {
    	Test();
    	return 0;
    }
    
    char *GetMemory( void )
    {
    	char p[] = "hello world";
    	return p;
    }
    
    void Test( void )
    {
    	char *str = NULL;
    	str = GetMemory();
    	printf( str );
    }

    结果:编译通过,运行时输出随机值

    原因:p为局部变量,函数执行完时被销毁。

    注:函数执行完时,


    3. 

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char *tmp;
    void GetMemory(char *p);
    void Test();
    
    int main()
    {
    	Test();
    	return 0;
    }
    
    char *GetMemory( void )
    {
    	char *p = "hello world";
    //	tmp = p;
    	return p;
    }
    
    void Test( void )
    {
    	char *str = NULL;
    	str = GetMemory();
    	printf( str );
    }

    编译运行均没有问题,可以输出helloworld

    “Hello world”在静态去

    GetMemory将它的地址返回了。

    4. 

  • 相关阅读:
    继承
    面向对象
    数据库的数据操作
    数据库数据类型以及建库语句
    第一天
    继承与多态
    C#面向对象——对象成员、方法重载、引用类库等
    C#面向对象初步
    SQL2008知识回顾
    C#知识回顾
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284685.html
Copyright © 2011-2022 走看看