使用C语言判断栈的方向

    这一问题主要是如何判读出先后入栈的变量的地址大小,比如有a, b两个变量一先一后被定义,如果a的地址大于b的地址,则说明是以低地址方向增长的,反之,往高地址方向增长。
在写C程序的时候不能简单直接的定义两个变量来比较它们的地址大小,因为这样很有可能编译器会做优化,最终导致结果不真实。为避免这种编译器优化的情况,可以采用将变量定义到函数中,然后递归调用该函数。例如下面的代码:
#include <stdio.h>

static int stack_direction = 0;

static void FindStackDirection()
{
    static char *addr = NULL;
    auto char dummy;
    if (NULL == addr) {
        addr = &dummy;
        FindStackDirection();   //递归调用,让dummy两次被定义,并一先一后入栈
    } else {
        if (&dummy > addr) {    //两次地址相比较,后入栈的dummy地址大于先前的地址则说明是往高地址增长
            stack_direction = 1;
        } else {
            stack_direction = -1;
        }
    }
}

int main(int argc, char const *argv[])
{
    FindStackDirection();
    if (1 == stack_direction) {
        puts("stack grew upward");
    } else {
        puts("stack grew downward");
    }

    return 0;
}

使用C语言判断栈的方向

时间: 2024-11-01 07:17:51

使用C语言判断栈的方向的相关文章

C语言函数调用栈(三)

6 调用栈实例分析 本节通过代码实例分析函数调用过程中栈帧的布局.形成和消亡. 6.1 栈帧的布局 示例代码如下: 1 //StackReg.c 2 #include <stdio.h> 3 4 //获取函数运行时寄存器%ebp和%esp的值 5 #define FETCH_SREG(_ebp, _esp) do{ 6 asm volatile( 7 "movl %%ebp, %0 \n" 8 "movl %%esp, %1 \n" 9 : "

反汇编--C语言(判断与分支)

if  else条件判断 C语言实现: void Conditional(int c){ if (c>0 && c<10) { printf("c大于0,小于10"); } else if(c>10 && c<100) { printf("c大于10,小于100"); } else{ printf("其它"); } } void main(){ int num=5; Conditional(

C语言,栈的实现

一.动态栈的实现 #include <stdio.h> #include <stdlib.h> #include <malloc.h> //定义一个节点的结构 typedef struct node { int member; //数据域 struct node *pNext; //指针域 }Node,*pNode; //定义一个栈结构 typedef struct stack { pNode Top; //栈顶 pNode Bottom; //栈底 }Stack,*p

C语言使用栈实现String类型的两个大数相加

要开始找工作了,记录下学习的关于数据结构的应用~~从栈开始~~ 栈和指针的应用~~~ 实现String类型的两个大数相加 主要思想是通过C语言的栈来实现,栈是后进先出的特点,因此很适合做这类计算.建立四个栈,分别按字符串字符先后顺序入栈大数的整数部分和小数部分,然后先计算小数部分的,由于小数部分是高位对齐,因此一直出栈最长小数栈的字符并进入小数结果的栈,小数位数对齐后,两个小数栈出栈进行相加.然后进行整数栈相加,由于整数部分是按低位对齐,因此直接出栈相加即可,将每位相加结果入结果整数栈.比如字符

==运算符是判断栈中两个值是否相等

默认情况下(也即类型没有重载==运算符的情况下),==运算符是判断栈中两个值是否相等.为了验证这个结论,来看下面的程序: namespace JudgeEquals{    class Program    {        static void Main(string[] args)        {            int a = 10;            int b = 10;            Console.WriteLine(a==b); string s1 = "a

C语言判断系统数据大/小端存储方式

小端存储:数据的低位部分,存储于存储器的低地址空间里. 大端存储:数据的低位部分,存储于存储器的高地址空间里. 首先,一般PC数据存储方式是小端存储. 基本实现思想是:将存储器中所存的数据按字节以地址顺序输出,与存入数据的高低位进行比较,即得出结论. 实现方法一: 1 #include <stdio.h> 2 int main(void) 3 { 4 short int x; 5 char *arr; 6 7 x = 0x1122; 8 arr = (char *)&x; 9 10 i

数据结构(C语言) 栈和队列

栈(stack) 是限定在表尾进行插入或删除操作的线性表,这是栈的定义,所有从本质上来说栈仍旧是线性表的特殊延伸.对栈来说,表尾端有特殊的含义,代表着栈顶(top),相应的,表头端为栈底(bottom).如果一个栈不含元素,则称其为空栈.栈遵循的是后进先出LIFO结构,即Last In First Out.(图) 栈的常用基本操作如下: (1)创造一个空栈 (2)销毁已存在的一个栈 (3)清空栈内数据 (4)判断栈内是否为空 (5)返回栈的长度 (6)返回当前栈顶元素 (7)压入新栈顶元素 (8

顺序栈(进制转换 + 括号匹配 + 判断栈表 + 最长括号匹配长度)

#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKLINCREMENT 10

C 提高1 内存四区 变量本质 栈开口方向 指针铁律1

C 提高第一天复习 内存四区,变量常量的本质,函数调用模型,栈开口方向,指针铁律1,指针是一种数据类型 C 提高学员标准:写一个标准的冒泡排序 选择法或者冒泡法排序 在一个函数内排序 通过函数调用的方式排序 数组做函数参数的技术盲点和推演 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i = 0; int j = 0; int tmp = 0; int a[] =