首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么指针的分配内存在函数之后仍然存在,而不是数组?

指针的分配内存在函数之后仍然存在,而不是数组的原因是因为指针和数组在内存中的存储方式不同。

指针是一个变量,它存储了一个内存地址,指向实际数据所在的位置。当我们在函数中分配内存给指针时,实际上是在堆内存中为指针指向的数据分配了一块内存空间。这块内存空间在函数执行完毕后并不会被释放,因为它是在堆上分配的,需要手动释放。所以即使函数执行完毕,指针仍然可以访问到这块内存空间。

而数组是一种连续存储的数据结构,它在栈上分配内存。当我们在函数中声明一个数组时,它会在函数执行完毕后自动被释放,因为数组是在栈上分配的,函数执行完毕后栈帧会被销毁,数组所占用的内存也会被回收。

因此,指针的分配内存在函数之后仍然存在,而不是数组。这也是使用指针进行动态内存分配的一个优势,可以在函数之后继续使用指针指向的内存空间,而数组则不具备这个特性。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):提供可扩展的计算容量,满足各种业务需求。产品介绍
  • 云数据库 MySQL 版(CDB):提供高性能、高可靠的云数据库服务。产品介绍
  • 云存储(COS):提供安全、稳定、低成本的云端存储服务。产品介绍
  • 人工智能平台(AI Lab):提供丰富的人工智能算法和模型,帮助开发者快速构建智能应用。产品介绍
  • 物联网通信(IoT Hub):提供稳定、安全、高效的物联网设备连接和数据通信服务。产品介绍
  • 视频直播(CSS):提供高清、低延迟的在线视频直播服务。产品介绍
  • 区块链服务(TBC):提供安全、高效的区块链应用开发和部署服务。产品介绍
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

,但不是同一个变量,在函数中改变这个变量指向不影响实参,引用却可以。...引用一旦初始化之后就不可以再改变(变量可以被引用为多次,但引用只能作为一个变量引用);指针变量可以重新指向别的变量。 不存在指向空值引用,必须有具体实体;但是存在指向空值指针。...静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用。...数组不是真正意义上指针,可以理解为常指针,所以数组名没有自增、自减等操作。...在任何同一时刻,union值存放了一个被先选中成员,结构体struct所有成员都存在。 27、什么是野指针和悬空指针

1.9K20

面试总结-C++

在执行函数时, 函数局部变量存储单元都可以在栈上创建 ,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集。 (3)从堆上分配 , 亦称动态内存分配 。...]表示指针数组,强调数组概念,是一个数组变量,数组大小为10,数组每个元素都是指向int类型指针变量。...- 指针free或delete之后没有及时置空 => 释放操作后立即置空。 ##### 指针数组区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。...用运算符sizeof 可以计算出数组容量(字节数)。sizeof(p),p 为指针得到是一个指针变量字节数,不是p 所指内存容量。...,每次用到这个变量时候都要去重新读取这个变量值,不是读寄存器备份。

2.1K11

c语言进阶部分详解(详细解析动态内存管理)

/just-a-try: 学习c语言过程、真 (github.com) 今天来介绍动态内存管理 相关内容: 一.为什么存在动态内存分配 我们熟悉内存开辟方法: int a = 20;//在栈空间上开辟四个字节空间...数组在申明时候,必须指定数组长度,它所需要存在编译时分配 但是,有时候我们需 要空间大小在程序运行时候才能知道 , 那数组编译时开辟空间方式就不能满足了。...如果成功,会返回指向重新分配内存空间指针;如果失败,会返回NULL,并且原来内存空间仍然有效 扩展空间情况也有两种: 当原有空间之后有足够大空间:要扩展内存就直接原有内存之后直接追加空间,原来空间数据不发生变化...} 在函数结束后,函数动态分配内存空间不会自动销毁。...这是因为动态分配内存空间是在堆上分配不是函数栈帧上。栈帧上局部变量在函数结束时会自动销毁,但堆上分配内存空间需要手动释放 。

7510

面试常考知识点总结——面试必看

为什么要给确认报文中ack值加1,为什么不是2,3,4?...函数体static变量作用范围为该函数体,不同于auto变量,该变量内存只被分配一次,因此其值在下次调用时仍维持上次值 在模板static全局变量可以被函数所有函数访问,但不能模板外其他函数访问...引用时别名;指针是地址 程序为指针变量分配内存区域,不为引用分配内存区域。 指针使用时要在前加 * ,引用可以直接使用。 引用在定义时就被初始化,之后无法改变;指针可以发生改变。...例如就++操作而言,对引用操作直接反应到所指向对象,不是改变指向;而对指针操作,会使指针指向下一个对象,不是改变所指对象内容。...全局变量保存在内存全局存储区,占用静态存储单元; 局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。 什么是平衡二叉树?

81820

C语言内存管理

2 内存分配方式 内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译时候就已经分配好,这块内存在程序整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。...在执行函数时,函数局部变量存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配内存容量有限。...(2)函数return语句写错了,注意不要返回指向“栈内存”指针”或者“引用”,因为该内存在函数体结束时被自动销毁。...由于addr函数变量k在函数返回后就已经不存在了,但是在全局变量p中却保存了它地址。...在下一个函数port中,试图通过全局指针p访问一个不存在变量,而这个指针实际指向却是另一个临时变量i,这就导致了死循环发生。

1.6K2319

C与C++内存管理避坑指南

2 内存分配方式 内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译时候就已经分配好,这块内存在程序整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。...在执行函数时,函数局部变量存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配内存容量有限。...(2)函数return语句写错了,注意不要返回指向“栈内存”指针”或者“引用”,因为该内存在函数体结束时被自动销毁。...由于addr函数变量k在函数返回后就已经不存在了,但是在全局变量p中却保存了它地址。...在下一个函数port中,试图通过全局指针p访问一个不存在变量,而这个指针实际指向却是另一个临时变量i,这就导致了死循环发生。

85220

程序员C语言快速上手——高级篇(十)

区别:所有函数都能访问全局变量,静态变量作用域则只局限于定义它函数内部 自动内存 在函数声明,函数调用时创建(分配在栈中),作用域局限于该函数内部,函数执行完则释放。...动态内存 内存分配在堆上,用完需手动释放,使用指针来引用分配内存,作用域局限于引用内存指针 为什么需要在堆上面分配动态内存?...,当原内存空间之后还有足够内存可分配时,那么就会紧随原内存空间之后扩展空间,这样一来,realloc返回void指针与指向原内存空间指针相同;如果原内存空间之后没有足够内存可扩展了,那么就在堆内存中其他拥有足够空间地方重新分配空间...可以看到,该函数之所以如此复杂,其目的就是为了保证申请空间都是一片连续内存空间,不是碎片化内存。...我们知道数组变量实际上也是一个指针,指向数组起始地址,结构体指针也是指向第一个成员变量起始地址,函数指针亦是指向函数起始地址。 所谓函数指针,就是一个保存了函数起始地址指针变量。

1.4K30

【C语言】动态内存管理大总结

✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 文章目录 为什么存在动态内存分配❓ 动态内存函数 malloc...和free calloc realloc 动态内存错误 经典笔试题 题目一: 题目二: 题目三: 题目四: C/C++程序内存开辟 柔性数组 柔性数组特点 柔性数组使用 柔性数组优势 总结 为什么存在动态内存分配...数组在申明时候,必须指定数组长度,它所需要存在编译时分配。 但是对于空间需求,不仅仅是上述情况。...栈内存分配运算内置于处理器指令集中,效率很高,但是 分配内存容量有限。 栈区主要存放运行函数分配局部变量、函数参数、返回数据、返 回地址等。...总结 回顾一下,本篇博客我们主要介绍了C语言动态内存相关知识,从为什么存在动态内存分配开始,逐渐深入,认识了动态内存函数以及相关使用,以及说明了一些常见动态内存错误。

39220

C语言进阶-动态内存管理柔性数组

目录 前言 为什么存在动态内存分配 动态内存函数介绍 malloc和free函数 malloc函数: free函数 calloc函数 realloc函数 常见动态内存错误 几个经典笔试题 C/C+...+程序内存开辟 柔性数组 柔性数组特点 柔性数组使用和优势 ---- 前言 ---- 本文章主要讲解: 动态内存管理使用即注意事项 有关于动态内存管理寄到笔试题讲解 柔性数组使用 为什么存在动态内存分配...数组申明必须指定数组长度,它所需要存在编译时分配) 但有时候我们需要空间大小在程序运行时候才能知道, 那数组编译时开辟空间方式就不能满足了,由此动态内存开辟就来了 动态内存函数介绍...(此时不是内存泄漏) 如果它在程序中没有被free就被指向另一块地址了(或者该被被销毁),那么就会导致这块地址在这个进程中永远无法被找到(即内存泄露:无用内存越来越大,操作系统得一直给这个进程分配内存...栈区主要存放运行函数分配局部变量、函数参数、返回数据、 返回地址等 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 (分配方式类似于链表) 数据段(静态区)(static

61020

C语言 | C++之sizeof使用

7 ,这里函数参数 str[] 已不再是数组类型,而是蜕变成指针,我们调用函数 GetStrLength() 时,程序会在栈上分配一个大小为 7 数组吗?...向函数形参传递数组数组将会退化为指针,失去原来数组特性。 4 结构体类型 sizeof 对于 struct 数据结构由 CPU 对齐问题导致 struct 大小变得比较复杂。...因为编译器为保证此空 struct 存在,专门分配一个字节。 如果存在结构体嵌套,无论内层还是外层均需要采用内存对齐。 5 类 sizeof 不含继承和 static 成员变量类。...每次声明了类 A 一个对象时候,为该对象在堆上,根据对象大小分配内存。...并且 sizeof 计算是数据类型占内存大小,strlen 计算是字符串实际长度。 数组做 sizeof 参数不退化,传递给 strlen 就退化为指针了。

2.5K88

C++知识概要

itVect 之后迭代器,迭代器相当于一个智能指针之后迭代器将失效。...为什么是 1.5 倍 vector 通过一个连续数组存放元素,如果集合已满,在新增数据时候,就要分配一块更大内存,将原来数据复制过来,释放之前内存,再插入新增元素 初始时刻 vector...、引用和指针都失效 函数指针 函数指针指向是特殊数据类型,函数类型是由其返回数据类型和其参数列表共同决定函数名称则不是其类型一部分 函数指针声明 int (*pf)(const... delete 会直接释放 p 指向内存,这个内存根本没有被系统记录,所以会崩溃 需要在 new [] 一个对象数组时,需要保存数组维度,C++ 做法是在分配数组空间时多分配了 4 个字节大小...由于静态全局变量作用域限于一个源文件,只能为该源文件函数公用,因此可以避免在其他源文件中引起错误。

1.1K20

CC++基础之sizeof使用

运行结果为4,97;并不是4,0 说明:sizeof 不是标准意义上一元操作符,不支持链式表达式,sizeof 作用域范围语句不会编译成机器码,如 sizeof(num++) 中 ++ 不执行。...7 ,这里函数参数 str[] 已不再是数组类型,而是蜕变成指针,我们调用函数 GetStrLength() 时,程序会在栈上分配一个大小为 7 数组吗?...向函数形参传递数组数组将会退化为指针,失去原来数组特性。 4 结构体类型 sizeof 对于 struct 数据结构由 CPU 对齐问题导致 struct 大小变得比较复杂。...因为编译器为保证此空 struct 存在,专门分配一个字节。 如果存在结构体嵌套,无论内层还是外层均需要采用内存对齐。 5 类 sizeof 不含继承和 static 成员变量类。...每次声明了类 A 一个对象时候,为该对象在堆上,根据对象大小分配内存。

33030

一个只有十多行代码 C 语言问题

esp 作为栈顶指针,在函数返回后,也会被收回。虽然栈帧在函数返回后被回收,但是其中数据并没有被回收,因此之前数据仍然存在。...变量地址是 0x0103fd6c, i 值是0x0132a670,这值是一个地址,也就是由 new 分配堆地址,看一下 0x0132a670 这个地址中值,如下图: ?...这部分内存如果不是人为去写,一般数据不会被修改或覆盖。 前面说数组在堆中情况,如果是在栈中的话,那么数组 i 值都在栈中,即7、9、5 也在栈中。 简单说一下。...仍然在 func return 处下断点,运行到这里,观察: ? 此时在 func 函数,继续单步返回到 main 函数: ?...观察,现在 ESP 和 EBP 已经恢复到 main 函数栈帧,而且代码也运行到了 main for 。 但是内存栈中,func 函数 i 数组仍然存在

72940

【AlexeyAB DarkNet框架解析】三,加载数据进行训练

函数形参ptr // 获取外部实参之后,二者本身没有关系,但是由于是指针变量,二者之间又存在一丝关系,那就是函数形参与函数外实参指向 // 同一块内存。...又由于函数外实参内存是动态分配,因此函数形参可以使用free()函数进行内存释放,但一般不推荐这么做,因为函数释放内存, // 会影响函数外实参使用,可能使之成为野指针,那为什么这里可以用...int h等(实际经过测试,在gcc编译器下,能访问但是值被重新初始化为0), // 因为函数形参和函数外实参共享一块堆内存,而这些非指针变量都是存在这块堆内存上,内存一释放,就无法访问了;...但这些图片不是一个线程读完,而是分配到多个线程并行读入, // 因此本函数n实际不是n,而是分配到该线程上n,比如总共要读入128张图片,共开启8个线程读数据,那么本函数n为16...,不是总数128 d.X.rows = n; //d.X为一个matrix类型数据,其中d.X.vals是其具体数据,是指针指针(即为二维数组),此处先为第一维动态分配内存 d.X.vals

1.1K20

UE4TArray(一)

数组实际占用内存,只有这3个成员变量内存(最少是16字节,一个指针+两个int,不同Allocator实际占用内存不同,最少是一个指针),实际元素内存是由Allocator分配,具体大小就是ArrayMax...数组内部内存扩容方式和STLvector是差不多,当容量满了之后,会额外分配一个更大内存,将整个数组数据拷到新内存上,之后再释放旧内存(InlineAllocator不会释放Inline部分...其中指针加数量和TArrayView本质是一样,都是从指针开始拷贝连续内存到数组。...个人更推荐使用TArrayView,因为TArrayView让指针和数量保存在同一个变量,从语义上来说更合理,而且只要是连续内存TArrayView都支持包装,包括默认静态数组,TStaticArray...,传入数组直接恢复到无分配默认状态,因此使用移动构造函数可以让数组作为函数参数和返回值,以及lambda时需要传入数组性能更好。

2.6K10

CC++面试必备知识

3.局部变量 从栈上分配,其作用域只是在局部函数,在定义该变量函数,只要出了该函数,该局部变量就不再起作用,也即该变量生命周期和该函数同在。...4.局部静态变量 从静态存储区域分配,其在第一次初始化后就一直存在直到程序结束。该变量特点是其作用域只在定义它函数可见,出了该函数就不可见了。...看到上面的第二张图,有的人可能会有疑问,为什么 short 不是紧挨着 char 呢?其实这个原因在上面已经给出了答案——自然对齐。为此,我们可以创建结构体验证自然对齐规则。...不管基类型是什么类型指针变量,他仍然指针变量,所以仍然占用 8 字节。...free(),局部变量存在栈区,malloc()在堆区; 局部变量在函数执行完毕之后回收栈空间; 调用时传递进去参数是str一份备份。

18130

【动态内存管理】

为什么存在内存分配 2. 动态内存函数介绍 2.1 malloc和free 2.2 calloc 2.3 realloc 3....2.数组在申明时候,必须指定数组长度,它所需要存在编译时分配。 但是对于空间需求,不仅仅是上述情况。...如果参数ptr指向空间不是动态开辟,那free函数行为是未定义。 如果参数ptr是NULL指针,那么函数什么事都不做。...5.C/C++程序内存开辟 C/C++程序内存分配几个区域: 栈区(stack):在执行函数时,函数局部变量存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。...栈内存分配运算内置于处理器指令集中,效率很高,但是 分配内存容量有限。 栈区主要存放运行函数分配局部变量、函数参数、返回数据、返 回地址等。

49600

C++面试知识总结

1.2 内存溢出原因 栈溢出:越界访问造成,例如局部变量数组越界访问或者函数局部变量使用过多,超出了操作系统为该进程分配大小,还有递归函数层次过多超过了栈大小。...在编译时候内联函数可以直接被嵌入到目标代码中,宏只是一个简单文本替换,内联函数可以完成诸如类型检测、语句是否正确等编译功能,宏就不具备这样功能。inline函数函数,宏不是函数。   ...因为不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象引用,所以比指针安全。由于const 指针仍然存在指针,并且有可能产生野指针,所以还是不安全。...程序会给指针变量分配内存区域,引用不需要分配内存区域。 返回引用时,在内存中不产生被返回值副本。...空指针:空指针表示“未分配” 或者“尚未指向任何地方” 指针。 区别:空指针可以确保不指向任何对象或函数; 未野指针或初始化指针则可能指向任何地方。

1.7K41

第 12 章 动态内存

栈内存——定义在函数非 static对象,当进入其定义所在程序块时被创建,在离开块时被销毁。 堆内存——存储动态分配对象,即那些在程序运行时分配对象。...当我们 delete一个指针后,指针值就无效了。虽然指针已经无效,但在很多机器上指针仍然存在(已经释放了)动态内存地址。...,当一个应用需要可变数量对象时,应该使用标准库容器不是动态分配数组,使用容器更为简单、更不容易出现内存管理错误并且可能有着更好性能。...不能对动态数组调用 begin或 end函数,也不能用范围 for语句来处理动态数组元素。 普通数组长度不能为 0,动态数组长度可以为 0。...对数组元素进行值初始化,可以再大小之后跟一对空括号。与分配单个对象不同,分配数组对象,不能在圆括号指定初始值。但是可以在花括号提供元素初始化器,具体规则与使用大括号初始化内置数组类似。

1.4K40

一文读懂C语言与C++动态内存

C、C++程序编译内存分配 1.从静态存储区域分配存在程序编译时就已经分配好,这块内存在程序整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。...2.在栈上分配 在执行函数时,函数局部变量存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配内存容量有限。...} 答案 栈区(stack):由编译器自动分配释放,存放为运行函数分配局部变量、函数参数、返回数据、返回地址等。...代码一:传入函数A( char *p )参数为字符型指针,在这个函数修改参数p值时并不能真正修改实参值,如: char *str = NULL; A(str); 执行完这两句后str仍然是NULL...代码二:其中p[]数组函数A中局部变量,函数返回后,p就被释放掉,str便指向了一段无用内存区域。 代码三:没有判断动态内存申请是否成功直接使用,没有释放动态申请内存,造成内存泄漏。

85910
领券