首页 > 代码库 > 动态内存可以跨函数使用示例与静态变量不能跨函数使用

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

 

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

 

# 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还会考到这个知识,哈哈!