栈区生长方向说明
在内存管理或内存模型中,与栈对应的是堆。堆的生长方向是向上的,即向着内存地址增加的方向。栈的生长方向是向下的,即向着内存地址减小的方向。在内存中,堆和栈共用全部的自由空间,两者没有固定的界限,如果在运行过程中,堆和栈增长到发生了相互覆盖,成为堆栈冲突,系统或者软件会发生崩溃。
代码验证栈的生长方向
代码测试环境: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