zoukankan      html  css  js  c++  java
  • 动态内存可以跨函数使用示例与静态变量不能跨函数使用

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

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

  • 相关阅读:
    web自动化,chrom浏览器怎么抓取出现时间3s后消失的元素的元素属性?
    怎么在一台电脑上同时启动多个tomcat
    windows7下部署tomcat
    吴裕雄天生自然Spring Boot基于MyBatis的Spring Boot Security操作实例
    吴裕雄天生自然SPRING BOOTAMQP实例
    吴裕雄天生自然SPRING BOOTAMQP高级消息队列协议
    吴裕雄天生自然Spring Boot基于Spring Data JPA的Spring Boot Security操作实例
    吴裕雄天生自然SPRING BOOT处理:escript: exception error: undefined function rabbitmqctl_escript:main/1
    吴裕雄天生自然Spring BootJMSJava消息服务
    吴裕雄天生自然Spring BootSpring Security
  • 原文地址:https://www.cnblogs.com/mjorcen/p/3813568.html
Copyright © 2011-2022 走看看