码迷,mamicode.com
首页 > 其他好文 > 详细

动态内存可以跨函数使用示例与静态变量不能跨函数使用

时间:2014-07-07 17:54:08      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   strong   数据   

 

动态内存可以跨函数使用示例

 

# include <stdio.h>
# include <malloc.h>

void f(int ** q)
{
    *q = (int *)malloc(sizeof(int)); //sizeof(数据类型) 返回值是该数据类型所占的字节数
            //等价于 p = (int *)malloc(sizeof(int));
    //q = 5; //error
    //*q = 5; //p = 5;
    **q = 5; //*p = 5;
}

int main(void)
{
    int * p;

    f(&p);
    printf("%d\n", *p);
    
    return 0;
}

 

有问题的(静态变量不能跨函数使用,以为一个函数执行完毕,他的空间将会被释放):

 1 # include <stdio.h>
 2 
 3 void f(int ** q) //q是个指针变量,无论q是什么类型的指针变量,都只占4个字节
 4 {
 5     int i = 5;
 6     //*q等价于p  q和**q都不等价于p
 7     //*q = i; //error 因为*q = i; 等价于 p = i; 这样写是错误的
 8     *q = &i;  // p = &i;
 9 }
10 
11 int main(void)
12 {
13     int *p;  //13行
14     
15     f(&p);
16     printf("%d\n", *p);  //16行  本语句语法没有问题,但逻辑上有问题 , i 的空间已经被释放
17 
18     return 0;
19 }

 

 

 

 

 

3、下程序中,能够通过调用函数fun,使main函数中的指针变量p指向一个合法的整型单元的是

A) main()

  {  int *p;

     fun(p);

     …

  }

  int fun(int *p)

  { int s;

    p=&s;

  }

B) main()

   { int *p;

     fun(&p);

     …

   }

  int fun(int **q)

  {  int s;

     *q=&s;

  }

C) #include <stdlib.h>

   main()

   {  int *p;

      fun(&p);

      …

   }

   int fun(int **q)

   {  *q=(int *)malloc(4);

   }

D)

   #include <stdlib.h>

   main()

  {  int  *p;

     fun(p);

     …

   }

   int fun(int *p)

   {  p=(int *)malloc(sizeof(int));

   }

                                              2003年4月45题

注释: 这个题很有意思。考查了:

1) 指针的指针的使用   2) 动态内存分配与自动变量的内存分配。

  动态分配的内存必须调用free()函数才能释放,而自动变量一旦跳出它的代码作用范围,就会由编译器自动释放掉。

让我们先看:

A) 选项无论fun()中p的值如何变化,都不会影响到主函数中p的值,因为它是值传递

B) 选项倒是把p的地址&p传递给了fun()函数,但遗憾的是,由于s是个自动变量,当推出fun()函数后,s变量所占内存单元会被会被释放掉,此时主函数中的p还是没法指向一个合法的int型单元

C) 选项fun()的形参 int **p;表明p是个指向指针变量的指针变量,即是个指针的指针。 而主函数中的 int *p; 表明p只是个指针变量,但&p则指向了p,&p也是个指向指针变量p的指针变量,实参和形参类型一致。 fun()的功能是使实参p指向了一个int型变量, 又由于该int型变量是由malloc()动态分配的,所以推出fun()函数并不会影响实参p的指向, 故C是对

D) 选项犯了和A同样的错误。 真想不到二C还会考到这个知识,哈哈!

 

 

 

 

 

 

 

动态内存可以跨函数使用示例与静态变量不能跨函数使用,布布扣,bubuko.com

动态内存可以跨函数使用示例与静态变量不能跨函数使用

标签:style   blog   color   使用   strong   数据   

原文地址:http://www.cnblogs.com/mjorcen/p/3813568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!