内存操作(指针,变量的生存期及作用范围,良好的动态内存申请和释放习惯)(

首先看看几个容易出错的问题:

(1)void GetMemory( char *p )

        

 {

           p = (char *) malloc( 100 );

         }

 

    void Test( void )

        {

           char *str = NULL;

           GetMemory( str );

           strcpy( str, "hello world" );

           printf( str );

        }

 结果:程序崩溃。

       因为 GetMemory 并不能传递动态内存, Test 函数中的 str 一直都是 NULL。
       strcpy(str, "hello world");将使程序崩溃。

 修正:GetMemory 函数为  char* GetMenory(char* p){return p=(char *) malloc(100);}

(2)char *GetMemory( void )

        {

           char p[] = "hello world";

           return p;

        }

     void Test( void )

       {

           char *str = NULL;

           str = GetMemory();

           printf( str );

        }

结果:可能是乱码。
      因为 GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容在函数结束时已经被清除,新内容不可知。可以返回局部变量的值,但不能返回局部变量的地址。(尽量不要让返回值为局部变量)

修正:GetMemory 函数为  char* GetMenory(char* p){return p = "hello world";}

(3)void GetMemory( char **p, int num )

       {

           *p = (char *) malloc( num );

       }

     void Test( void )

       {

           char *str = NULL;

           GetMemory( &str, 100 );

           strcpy( str, "hello" );

           printf( str );

       }

结果:输出字符串"hello"。

(4void Test( void )

       {

            char *str = (char *) malloc(100);
            strcpy(str, “hello”);
            free(str);
            if(str != NULL)

               {
                strcpy(str, “world”);
                printf(str);

               }
       }

结果:free(str) 之后,str 成为野指针, if(str != NULL)语句不起作用。详情看野指针的介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值