栈增长方向和数组增长方向

栈的增长方向和变量内存分配没有关系

帖子回复:

1

一年多过去了,今天我搜到了这个帖子。正好我看到的一本书里面是这样说的:
默认的函数内部变量的压栈操作为:从上到下、从左到右,采用4字节对齐。数组的压栈方法略有不同,即从最后一个元素开始,直到起始元素为止,即采用从右向左的方法压栈。
书名是 《C语言进阶:重点、难点与疑点》

2

所谓 栈空间的生长方式由高到低,指的是(以 X86 体系结构为例),一些默认使用 sp (stack pointer)寄存器的指令,如 push, pop, call, ret 等,在入栈的时候 sp 会减小,出栈的时候 sp 增加。
其实栈空间也是一段普通的内存,可以任意的方式访问;sp 也可以不通过 push pop 直接操作。
以上是机器语言实现层面的问题。在这里,没有所谓数组的概念。
在访问函数参数与局部变量的时候,几乎一定是不会用 push 和 pop 的。
开辟空间的时候,参数入栈经常不使用 push ,局部变量开辟空间几乎一定不会用 push (而是直接 sub sp)。
编译器生成代码用 sub sp 预留一段空间给局部变量用,然后把那一段给那个变量用,编译器就可以自行决定了。
由于这只是一段普通的内存,当然怎么用都可以。
以下说 C 语言。
然而 C 语言本身并没有栈的概念。
C 语言只规定了一些特殊情况下的指针比较结果,如在两个指针指向同一数组中的元素时(序号大的大于序号小的),指向同一个结构体对象的成员时(后定义的成员大于先定义的成员),等等。但是对于指向同一个函数的不同局部变量的指针之间的比较结果并没有规定。也就是说,编译器可以随便安排他们的顺序。
===================
这里应该是将不同层面的问题混淆在了一起。

其他回复可参看论坛

论坛讨论:http://bbs.csdn.net/topics/390747622

时间: 2024-11-03 21:59:53

栈增长方向和数组增长方向的相关文章

7 线性表-栈-顺序存储的拓展-迎面增长的存储方式

描述:设有两个栈,S1和S2,都采用顺序栈的存储方式.两个栈共享一个存储区:[0,--maxsize-1]目的:可以尽量利用空间,减少溢出的可能,采用栈顶相向.迎面增长的存储方式 PS:要注意判断栈满栈空的检查 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; #define maxsize 100 /*栈结构的定义*/ typedef struct { int st

用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue

一,用结点实现链表LinkedList,不用换JavaAPI的集合框架 import java.util.Scanner; public class Main { public static class Node { int data; Node next=null; public Node(int data){this.data=data;}; } public static class MyLinkedList { Node head=null; public MyLinkedList()

python全栈开发devops运维自动化方向初到高级在线课程分享

适用人群 面向想要devops方向发展的全栈python运维开发工程师 课程概述 课程范围:我们的课程由浅入深包含C01到C05五个等级:包含前后端知识,覆盖培养一个合格python全栈工程师所需要的所有技能:还有Ca系列附加课对开发规范和git使用方式提供帮助说明,并对一些新的知识点持续更新: 包含项目:一共4个项目(用户系统cmdbansible任务管理系统项目发布系统),并包含源码. 视频课程地址和详情介绍:http://study.163.com/course/introduction.

软件开发方向:字符串数组的Indexof()方法为什么不能用

public double[,] GetLoadData(string[] strArr)        {            double[,] S = new double[16, 8];            foreach (string str in strArr)            {                strArr.indexof() //在自动提示里面,不出现indexof()这个函数.                                 stri

当插入数据失败时,防止mysql自增长字段的自增长的方法

问题描述: 当mysql设置了自增长字段时(注意:一个表中只能设置一个自增长字段,可以不是主键,但必须是键 ),如果插入数据失败,那么自增长字段仍然会占用这个自增长值,再次成功插入数据时就会造成断层. 原因: 自增是缓存在内存字典中的,分配方式是先预留,然后再插入的.所以插入失败不会回滚内存字典. 解决方法: 在php程序中可以加一段代码,当插入数据失败时,执行sql语句重新设置auto_increment的值: $sql = alter table `tbname` auto_incremen

Swift - 判断设备方向(或监听设备方向的改变)

通过UIDevice.currentDevice()来获取设备,可以取得设备当前的方向. 同时,我们可以添加一个通知来监听设备方向的变化,这样在开发中可以对不同的方向定制不同的排版布局界面. 下面通过一个样例,演示如何监测设备方向: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 import UIKit cla

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括

将sql Server 的table的列 ,由非自增长改为自增长

转载:http://www.thinksaas.cn/topics/0/423/423869.html Demo /**************** 准备环境********************/ --判断是否存在test表 if object_id(N'test',N'U') is not null drop table test --创建test表 create table test ( id int not null, name varchar(20) not null ) --插入临

《程序员面试指南》第一章 栈和队列 构造数组的MaxTree

题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @CreateDate: 2018/4/5 22:16 * @Modify by: * @ModifyDate: */ public class Chapter1_8 { public Node getMaxTree(int[] arr) { if (arr == null) { return null; }