6跨函数使用内存

Posted zh-xiaoyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6跨函数使用内存相关的知识,希望对你有一定的参考价值。

1、静态变量不能跨函数使用(重点)

/*----------------------------------------------------------------------------------------
静态变量不能跨函数使用
------------------------------------------------------------------------------------------
指针变量地址只能是**类型,这里q存放的是指针变量p的地址,那么*q就是p,把i的地址发
送给*q就等于把i的地址发送给p,既然p是i的地址那么*p就是i,所以*p=5。
但这个程序是错误的:q和i是静态分配的,f终止之后,为f分配的静态变量的空间会被释放,
当执行16行的时候f函数已经终止,p指向的变量i也不存在了,也就是p指向的i变量的访问权
限返回给操作系统了,不能再被使用了(此时p还能保存i的地址),也就不能读出i变量的内容。
-------------------------------------------------------------------------------------------*/

# include <stdio.h>

void f(int ** q) //q是个指针变量,无论q是什么类型的指针变量,都只占4个字节
{
    int i = 5;
    //*q等价于p  q和**q都不等价于p
    //*q = i; //error 因为*q = i; 等价于 p = i; 这样写是错误的
    *q = &i;  // p = &i;
}

int main(void)
{
    int *p;  //13行
    
    f(&p);
    printf("%d
", *p);  //16行  本语句语法没有问题,但逻辑上有问题

    return 0;
}

2、动态内存可以跨函数使用(重点)

/*----------------------------------------------------------------------------------------
动态内存可以跨函数使用
-------------------------------------------------------------------------------------------*/

# 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);// 5
    
    return 0;
}

 

以上是关于6跨函数使用内存的主要内容,如果未能解决你的问题,请参考以下文章

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

nodejs常用代码片段

android如何跨片段分离/附加保留视图状态

多级指针(静动态内存的跨函数访问)

跨活动的片段之间的共享元素转换不一致

如果只有一个线程使用互斥锁,跨线程的共享内存会损坏吗?