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)
{
    *q = (int *)malloc(4); // 动态分配的内存,程序员不手动释放的话,操作系统并不会自动为其释放内存
}

void g(int ** q)
{
    int r; //静态分配的内存,在该函数(g)调用完毕后,操作系统自动为期释放内存(出栈)
    *q = &r;
} //要想实现跨函数使用内存,只能通过使用动态内存的方法

例子

#include <stdio.h>
#include <malloc.h>

struct Student
{
    int sid;
    int age;
};
struct Student * CreateStudent(void);
void ShowStudent(struct Student *);

int main(void)
{
    struct Student * ps;
    ps = CreateStudent();
    ShowStudent(ps);
    return 0;
}

void ShowStudent(struct Student * pst)
{
    printf("%d %d\n", pst->sid, pst->age);
}

struct Student * CreateStudent(void)
{
    struct Student * p = (struct Student *)malloc(sizeof(struct Student));
    p->sid = 99;
    p->age = 88;
    return p;
}
/*
输出结果:99 88
*/
时间: 2024-12-29 04:06:02

L2--跨函数使用内存的相关文章

跨函数使用内存空间

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

6、跨函数使用内存

1.静态变量不能跨函数使用(重点) /*---------------------------------------------------------------------------------------- 静态变量不能跨函数使用 ------------------------------------------------------------------------------------------ 指针变量地址只能是**类型,这里q存放的是指针变量p的地址,那么*q就是p,

使用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:

TensorFlow中的L2正则化函数:tf.nn.l2_loss()与tf.contrib.layers.l2_regularizerd()的用法与异同

tf.nn.l2_loss()与tf.contrib.layers.l2_regularizerd()都是TensorFlow中的L2正则化函数,tf.contrib.layers.l2_regularizerd()函数在tf 2.x版本中被弃用了. 两者都能用来L2正则化处理,但运算有一点不同. import tensorflow as tf sess = InteractiveSession() a = tf.constant([1, 2, 3], dtype=tf.float32) b =