C99语法之栈上开辟内存

C/C++中在栈上开辟内存是最常见的,而且只要是在栈上开辟内存都要是固定的,而C99中有种用法相当奇葩

int *p = ((int[]){ [0] = 1, [15] = 10 });

在栈上分配这么一个空间,其反汇编结果如下:

 1     int *p = ((int[]){ [0] = 1, [15] = 10 });
 2 00053F18  mov         dword ptr [$S1],1
 3 00053F1F  mov         dword ptr [ebp-50h],0
 4 00053F26  mov         dword ptr [ebp-4Ch],0
 5 00053F2D  mov         dword ptr [ebp-48h],0
 6 00053F34  mov         dword ptr [ebp-44h],0
 7 00053F3B  mov         dword ptr [ebp-40h],0
 8 00053F42  mov         dword ptr [ebp-3Ch],0
 9 00053F49  mov         dword ptr [ebp-38h],0
10 00053F50  mov         dword ptr [ebp-34h],0
11 00053F57  mov         dword ptr [ebp-30h],0
12 00053F5E  mov         dword ptr [ebp-2Ch],0
13 00053F65  mov         dword ptr [ebp-28h],0
14 00053F6C  mov         dword ptr [ebp-24h],0
15 00053F73  mov         dword ptr [ebp-20h],0
16 00053F7A  mov         dword ptr [ebp-1Ch],0
17 00053F81  mov         dword ptr [ebp-18h],0Ah
18 00053F88  lea         eax,[$S1]
19 00053F8B  mov         dword ptr [p],eax  

这个也是在栈上开辟的因此需要指定,固定大小,也需要指定。

                                                      by:ECN14

时间: 2024-08-23 03:29:19

C99语法之栈上开辟内存的相关文章

栈和堆上的内存分配和回收

栈上的内存,函数结束的时候这个函数用的内存自动释放:堆上的内存,你必须自己释放,否则就会一直存在,但程序退出时,操作系统会清理进程使用的所有资源,这是就会释放掉堆,堆都没了,内存自然也没了 问题在于,很多时候进程并不会马上退出,比如服务器程序一跑就是几个月,如果分配的那块代码只跑一次那还好,但通常会反复执行,那么分配出去的内存就会越来越多,而又没有机会释放,最终的结果是堆内存耗尽,再次分配失败,程序被迫退出或者耗尽系统资源被操作系统强制杀死.

自动变量和开辟内存的生存期和作用域探讨

<C程序设计>谭浩强第4版针对Auto变量的生存期作用域做出了说明,包括内存管理与释放,指出“函数执行完后,会自动释放自动变量所占用的内存单元” 函数结束后,自动变量会被释放,即便以指针的形式返回,返回后,指针地址没有变,但是,任何读取操作都会刷新这段内存到不可预知的状态 如果使用函数返回值,可以使用malloc申请内存,操作完成后return出去 代码及运行结果如下: 1 // CUITestingCPP.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include &quo

定义一个只能在栈上构造对象的类

只能在堆上定义的对象可以通过声明构造函数是私有的,然后提供两个静态的方法,一个方法用来获取堆上的对象,一个用来释放堆上的对象.C++中定义一个不能被继承的类中第二种方法就是通过这种方式声明了一个不能被继承的类,但是这个类的对象就只能位于堆中了. 那么如何一定一个只能在栈上构造的对象? 这个就涉及到了C++中new这个操作符,它包含两步: 调用一个全局的operator new函数分配一定的内存空间 调用对象的构造函数 如果不允许一个类在堆上分配内存,但是允许其在栈上分配内存,对比这两种方式可以发

十、逃逸分析和栈上分配

Java堆区已经不再是对象实例分配的唯一空间,可以在堆区之外分配内存以提升效率降低频率,逃逸分析即是如此. 什么是逃逸分析? 例如: 一个成员方法的内部实例化了一个对象,如果这个对象被方法外的引用指向了,那么就发生了逃逸现象.JVM在内存分配的时候会分析其是否发生逃逸,如果未发生逃逸的,那么就直接在栈上分配内存空间,其生命周期和线程相同.(也称之为"栈上分配") 原文地址:https://www.cnblogs.com/lay2017/p/8157760.html

【转】数据结构中栈和堆---内存分配中栈和堆

一.数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈.堆和栈都是一种数据项按序排列的数据结构. 1)栈就像装数据的桶或箱子  我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体). 2)堆像一棵倒过来的树 而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值.通常我们

C++ 在堆上开辟与释放二维、三维指针

//C++ 在堆上开辟与释放二维.三维指针 #include<iostream> using namespace std; int main() { //二级指针的开辟与释放 int number = 0; int** p = new int*[4]; for(int i = 0; i < 4; i++) //分级定义数组大小 { p[i] = new int[4]; } for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j

堆和栈(java内存)

栈内存: 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存: 堆内存用于存放由new创建的对象和数组. 在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或 者对象在堆内存中的首地址,在栈中的这个特殊的变量

垃圾回收GC:.Net自动内存管理 上(一)内存分配

垃圾回收GC:.Net自动内存管理 上(一)内存分配 前言 .Net下的GC完全解决了开发者跟踪内存使用以及控制释放内存的窘态.然而,你或许想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包含非常详细的内在算法描述.同时,还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 引子 为你的应用程序实现合理的资源管理是一件困难的,乏味的工作.这可能会把你的注意力从你当前正在解决的实际问题中转移到它身上.那么,如果有一个现有的机制为开发者管理令人厌恶的内存管理,会

栈、堆内存到底是如何申请的,方法是如何入栈出栈的——内存结构理解学习

Lee出品,转载请注明出处http://blog.csdn.net/hnulwt/article/details/42934365 对于软件开发者而言,理解和熟悉计算机内存知识是很基础的.今天我就来翻翻旧账,回顾看看有哪些点遗漏了,在此共同学习. 提起内存,我们常常想到三个区域: 1,静态区,静态变量 static variables / constant  ,常量,静态变量就存储在静态区域,这个区域比较简单,只需要知道怎么通过地址访问他就行了. 2,堆,也叫堆栈(这里要注意堆栈 和 栈 是不同