您的位置:首页 > 其它

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

2011-12-09 16:40 537 查看
首先看看几个容易出错的问题:

(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"。

(4[b])void Test( void )[/b]

       {

            char *str = (char *) malloc(100);

            strcpy(str, “hello”);

            free(str);

            if(str != NULL)


               {

                strcpy(str, “world”);

                printf(str);


               }

       }


结果:free(str) 之后,str 成为野指针, if(str != NULL)语句不起作用。详情看野指针的介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null
相关文章推荐