堆栈中栈区的生长方向与大小端详解

栈区生长方向说明

在内存管理或内存模型中,与栈对应的是堆。堆的生长方向是向上的,即向着内存地址增加的方向。栈的生长方向是向下的,即向着内存地址减小的方向。在内存中,堆和栈共用全部的自由空间,两者没有固定的界限,如果在运行过程中,堆和栈增长到发生了相互覆盖,成为堆栈冲突,系统或者软件会发生崩溃。

代码验证栈的生长方向

代码测试环境:Windows 10 专业版,64bit操作系统;Dev-C++ Version 5.11

#include <stdio.h>  
static int stack_dir = NULL;
static void find_stack_direction (void)
{
	static char* addr = NULL; /* address of first `dummy', once known */
	char dummy; /* to get stack address */
	if (addr == NULL)  
	{                             
		addr = &dummy; /* initial entry */
		find_stack_direction (); /* recurse once */  
	}
	else
	{
		if(&dummy > addr)
		{
			stack_dir = 1;
		}
		else
		{
			stack_dir = -1;
		}
	}
}

int main(void)
{
	find_stack_direction();
	if(stack_dir == 1)
	{
		puts("Stack grew upward\n");
	}
	else
	{
		puts("Stack grew downward\n");
	}
	return 0;
}

运行结果展示:
在这里插入图片描述

大端(Big-Endian)与小端(Little-Endian)

不管大端还是小端,从记忆与区分的角度来讲,都先记低位字节在什么地址放置。
大端:低位字节在高地址上,高位字节在低地址上。
小端:低位字节在低地址上,高位字节在高地址上。
有以下两种常见的方式来判断数据的存储方式是大端还是小端:
方法1:使用指针

#include <stdio.h>
int x = 1;
int main(void)
{
	if(*(char*)&x == 1)
	{
		printf("Little-Endian\n");
	}
	else
	{
		printf("Big-Endian\n");
	}
	return 0;
}

参考链接

https://www.cnblogs.com/xkfz007/archive/2012/06/22/2558935.html
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据引用和引用的内容,栈(Stack)和堆(Heap)是两个不同的概念。栈是操作系统在建立进程或线程时为其分配的存储域,具有FIFO(先进先出)的特性,用于存储局部变量和函数调用的相关信息。而堆是应用程序在运行时向操作系统请求分配的内存空间,用于存储动态分配的数据。 根据引用和引用的内容,栈(Stack)和堆(Heap)的存储内容也是不同的。在栈中,函数调用时首先进栈的是下一条指令的地址,然后是参数和局部变量。在函数调用结束后,栈会依次出栈,恢复到函数调用之前的状态。而堆中的存储内容由程序员自行安排,一般用于存储动态分配的数据。堆中的具体内容是由程序员控制的,通常在堆的头部存放堆的大小。 根据引用的内容,堆和栈的使用示例可以更好地说明它们之间的别。在这个示例中,全局初始化和全局未初始化用于存储全局变量,栈用于存储局部变量和函数参数,堆用于存储通过动态分配得到的内存空间。在这个示例中,p1和p2指向的内存空间是通过malloc函数在堆中分配得到的,而p3指向的字符串是存储在常量的。 综上所述,栈和堆是两个不同的概念。栈是操作系统为进程或线程分配的存储域,用于存储局部变量和函数调用的相关信息;而堆是应用程序在运行时向操作系统请求分配的内存空间,用于存储动态分配的数据。它们的存储内容和使用方式也是不同的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [堆、栈、堆栈别(总结)](https://blog.csdn.net/Britripe/article/details/117083092)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值