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

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

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

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

时间: 2024-10-27 13:00:44

动态内存可以跨函数使用示例与静态变量不能跨函数使用的相关文章

C++静态变量和静态成员函数的怪脾气

     今天为了代码更加简洁,用了一个class MSGHelper来定义一些静态成员变量和静态成员函数. 开始时,我的写法是(不是真实代码,只是举例): <strong>class helper { static int index; static void SENDMSG(tcpsocket *&,string &): }; static int helper::index=1; static void helper::SENDMSG(tcpsocket * &s

如何在MD(d)和MT(d)工程间正确分配和释放动态内存

MD(d)和MT(d) MD(d)和MT(d)是windows下VC开发的两个编译选项,表示程序的运行时库编译选项. /MT是"multithread, static version" 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号. /MD是"multithread- and DLL-specific version",意思是多线程DLL版本,定义了它后,编译器把MSVCRT.li

FreeRTOS 动态内存管理

本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面章节讲解的任务创建. 信号量. 消息队列. 事件标志组. 互斥信号量. 软件定时器组等需要的 RAM 空间都是通过动态内存管理从 FreeRTOSConfig.h 文件定义的 heap 空间中申请的. 动态内存管理介绍FreeRTOS 支持 5 种动态内存管理方案,分别通过文件 heap_1,heap_2,heap_3,heap_4 和 heap_5实现,这 5 个文件在 FreeRTOS

第一周 从C走进C++ 006 动态内存分配

1. 用new 运算符实现动态内存分配 第一种用法,分配一个变量: P = new T; T是任意类型名,P是类型为T * 的指针. 动态分配出一片大小为 sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P.比如: int * pn; pn = new int; * pn = 5; 第二种用法,分配一个数组: P = new T[N]; T :任意类型名 P :类型为T * 的指针 N :要分配的数组元素的个数,可以是整型表达式 动态分配出一片大小为 sizeof(T)字节的内

c++ 学习笔记:动态内存(一)直接管理内存

what:什么是动态内存? c++中,普通变量(非static对象)存储在栈内存中,静态变量(局部static.类static)存储在静态内存中,在系统中还存在另外一种内存池,这部分内存供程序来分配,一般称作“自由空间“(free store)或”堆“(heap). where & When:在哪里何时使用动态内存? 以往学的变量中,全局对象在程序启动时创建,程序结束时销毁:局部对象在进入程序块时被创建,在离开块时被销毁:局部static对象在第一次使用时被创建,在程序结束时被销毁.可是有时候我

【Cpp】考点·堆栈&amp;动态内存分配

动态内存分配 堆内存分配与释放 C/C++定义了四个内存区间:代码区,全局变量与静态变量区,局部变量区(栈区),动态内存区(堆区) 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配.有些操作对象只在程序运行时才确定,这样编译时无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配.所有动态存储分配都在堆区中进行. 当程序运行到需要一

简单理解动态内存分配和静态内存分配的区别

在涉及到内存分配时,我们一般都要考虑到两种内存分配方式,一种是动态内存分配,另一种是静态内存分配,我们该怎么理解这两者的区别呢? 在我看来,静态内存分配和动态内存分配比较典型的例子就是数组和链表,数组的长度是预先定义好的,在整个程序中是固定不变的,所以他在内存分配时是以静态内存分配的方式进行的.而链表,它的信息有可能会随时更改,内存的分配取决于我们实际输入的数据,这样就用到了动态内存分配的方式. 静态内存分配是在程序编译或者运行过程中,按事先规定的大小分配内存空间的分配方式,他的前提的必须事先知

JS复习—函数(函数的形参和实参没整理,函数的方法待补充,函数化编程待扩展)

函数 一.函数的定义 只定义一次,但可以被执行或调用任意次.JavaScript中函数是参数化的:函数的定义包括一个称为形参的标示符列表,这些参数在函数体中像局部变量一样工作.如果函数挂在在一个对象上,作为对象的一个属性,就称它为对象的一个方法.当通过这个对象来调用函数时,该对象就是此次调用的上下文,也就是该函数的this的值.用于初始化一个新创建的对象的函数称为构造函数. 二.函数的三种定义方式 1.函数声明: 函数声明语句实际上声明了一个变量,并把一个函数对象复制给它. function s

PHP笔记4__函数/全局、静态变量/函数参数/加载函数库/,,

<?php header("Content-type: text/html; charset=utf-8"); echo table(5,5); function table($rows,$cols){ //函数 $str = ''; $str .= '<table border="1" width="800" align="center">'; $str .= '<caption><h1&