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\n", *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\n", *p);// 5

    return 0;
}

原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/12641882.html

时间: 2024-10-21 13:06:54

6、跨函数使用内存的相关文章

跨函数使用内存空间

所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法.动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小.凡是在程序中用到系统提供的动态分配存储空间函,均要求包含头文件<malloc.h>. Malloc 向系统申请分配size字节的存储区.返回分配内存空间的起始地址,若分配失败,则返回0,类型是 void* (或chaar*).ma

L2--跨函数使用内存

介绍 #include <stdio.h>#include <malloc.h> int main(void) { int *p; //定义了一个指针变量,但并没有为期附初值:下面两个函数都是为其fu初值的操作 f(&p); //f函数,为指针变量p附了一个准确的值,所以是正确的操作 //g(&p);//g函数,虽然在g函数执行过程中未p附了一个准确的值,但g函数执行结束后指针变量的值,并非是一个准确的值 return 0; } void f(int ** q) {

使用malloc和free函数进行内存动态分配

一.在学习c语言里面,内存分配这个话题非常有意思,因为我们平时在开发的时候,如果一不小心没注意内存释放的话,写的的程序很容易出错,所以今天就来回顾一下c语言里面的内存动态分配,下面我们先来看一个实例来进行分析 1 #include <stdio.h> 2 #include <malloc.h> 3 int main(void) 4 { 5 int a[5] = {4, 10, 2, 8, 6}; 6 int len; 7 printf("请输入数组的长度大小:len= &

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

动态内存可以跨函数使用示例 # 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(v

virsual studio 2008 跨dll释放内存,堆指针无效问题

运行时 触发了virsual studio的assert断点.输出内容如下: HEAP[xx.exe]: Invalid Address specified to RtlValidateHeap( 00C80000, 00CACFFC )Windows 已在 xx.exe 中触发一个断点. 其原因可能是堆被损坏,这说明 xx.exe 中或它所加载的任何 DLL 中有 Bug. 原因也可能是用户在 xx.exe 具有焦点时按下了 F12. 经过屏蔽最近的修改内容,逐渐找到原因是 传递的一个结构体中

【C语言】 字符串操作函数及内存拷贝函数归总

今天在这里把零散的一些常用的字符串操作函数和内存拷贝函数进行一下归总实现. 一 . 字符串操作函数 字符串操作函数有很多,这里我列举一些常用的函数,以及自实现的代码: 字符串拷贝函数: 函数原型: char* my_strcpy(char* dst,const char* src) strcpy(): char* my_strcpy(char* dst,const char* src) {     assert(dst);     assert(src);     char *ret = dst

malloc函数分配内存失败的常见原因

malloc()函数分配内存失败的常见原因:  1. 内存不足.  2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存就会失败,返回空指针NULL(0). malloc中做了哪些事情: 简单的说就是系统中有一个位置标记,标记了 当前已经用掉的内存用到了什么位置,系统中还有一个链表把各个未用的内存块连接起来,申请新内存的时候就未分配的链表中依次查找一个够用的内存块,把这次分配的内存地址返回给用户,把这次用掉的进行映射

部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)

部署spring boot + Vue遇到的坑(权限.刷新404.跨域.内存) 项目背景是采用前后端分离,前端使用vue,后端使用springboot. 工具 工欲善其事必先利其器,我们先找一个操作Linux系统的工具极力推荐FinalShell. 一眼看过去是不是感觉很方便,对内存.CPU的监控也可以实时看到,访问目录更是方便,对于Linux小白来说简直是神兵利器. 好了,我要开始入坑了. 问题一:权限不够 把vue包放到tomcat->webapps->ROOT目录下. 启动tomcat:

PHP共享内存段实现,使用shmop函数实现内存共享

所谓内存共享:就是多个应用程序公用一个内存段,在A程序中可以获取B程序存储在这个内存段的数据,也就是数据共享. shmop是PHP提供的函数集,在配置PHP的时候使用 -enable-shmop后,就可以使用这个函数集提供的函数, shmop对LINUX更加友好,而对于WINDOWS来说就不怎样了,不支持CGI和CLI模式~有点尴尬. 来说说他提供的一些函数: ftok函数:生成一个数字或叫做键或key.$key = ftok(fileName, mode); 一般情况下,这个fileName可