最近评论
文章分类
    收藏
      相册
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 指针参数的分配内存问题收藏

      新一篇: 递归复杂性定理 | 旧一篇: [转]sizeof详解

       void GetMemory(char *p)
      {
      p = (char *)malloc(100);
      }
      void Test(void)
      {
      char *str = NULL;
      GetMemory(str);
      strcpy(str, "hello world");
      printf(str);
      }请问运行Test函数会有什么样的结果?

      答:内存错误,GetMemory并没有给str分配内存空间,p是str的复制,p和str指向同一块内存区域

      上面的程序p复制了str成为NULL指针,然后p分配到了内存空间,而str仍然为NULL,所以出错

      修改为引用传递就可以了。或者改用指针的指针。

       void GetMemory(char *&p)
      {
      p = (char *)malloc(100);
      }

      进一步考虑下面的情况

       void GetMemory(char *p)
      {
           char *s1="222222";
           p=s1;                                                 //p指向了s1,而str没有,所以str仍然是111111
           strcpy(p, "hello world");                 //p和str指向同一块内存,所以这句把“hello world”拷贝到了str指向的内存中
      }
      void Test(void)
      {
      char str[] = "1111111";
      GetMemory(str);
      printf(str);                                     
      }

      char *GetMemory(void)
      {
      char p[] = "hello world";
      return p;
      }
      void Test(void)
      {
      char *str = NULL;
      str = GetMemory();
      printf(str);
      }
      请问运行Test函数会有什么样的结果?答:
      str指向一块已经释放掉的内存,结果错误。指针p指向的“hello world”内存由于在栈中分配,在函数结束后释放

      一个由c/C++编译的程序占用的内存分为以下几个部分
      1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于

      数据结构中的栈。
      2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据

      结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
      3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态

      变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统

      释放。
      4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
      5、程序代码区
      这是一个前辈写的,非常详细
      //main.cpp
        int a=0;    //全局初始化区
        char *p1;   //全局未初始化区
        main()
        {
         int b;栈
         char s[]="abc";   //栈
         char *p2;         //栈
         char *p3="123456";   //123456\0在常量区,p3在栈上。
         static int c=0;   //全局(静态)初始化区
         p1 = (char*)malloc(10);
         p2 = (char*)malloc(20);   //分配得来得10和20字节的区域就在堆区。
         strcpy(p1,"123456");   //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。

      发表于 @ 2007年06月06日 15:46:00|评论(loading...)|编辑

      新一篇: 递归复杂性定理 | 旧一篇: [转]sizeof详解

      评论:没有评论。

      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © pikerbright