unsigned char与unsigned char m_array[5]

#include <stdio.h>

int main(int argc, char **argv)
{
	unsigned char	ch_1 = '1';
	unsigned long*	ch;
	unsigned char	m_array[5] = {0};
	unsigned char	test;

	test = sizeof(ch_1);

	ch = (unsigned long *)0x0012ff71;
	*ch = 0x31;

	return 0;
}

变量储存空间分布图:


内存:


对比变量声明顺序:

unsigned char ch_1 = '1';
unsigned long* ch;
unsigned char m_array[5] = {0};
unsigned char test;

得出结论:

栈为递减分配变量储存的;

Breakpointtest = sizeof(ch_1);

内存:


改变内存单元号:

0x0012FF6C0x0012FF7C0x0012FF700x0012FF74

---------------------------------------------------------------------------

Breakpointch = (unsigned long *)0x0012ff71;

内存:


改变内存单元号:

+0x0012FF790x0012FF7B;

---------------------------------------------------------------------------

Breakpoint*ch = 0x31;

内存:


改变内存单元号:

0x0012FF72;


在例程中增加:

unsigned char* ha_1;
ha_1 = (unsigned char *)malloc(sizeof(unsigned char) * 5);

变量地址:


变量值:


内存:


执行:

*ha_1 = '1';
ha_1++;
*ha_1 = '2';

变量地址:


变量值:



内存:


执行到:


变量地址:


程序开始运行时:



变量地址:


得出什么结论呢?

unsigned long* ch;
unsigned char* ha_1;
unsigned char m_array[5] = {0};

声明之后,均指定了规定的内存空间;并非是m_array[5]有分配空间而ch未分配内存空间;

ha_1经过malloc()空间分配之后,与m_array[5]ch有什么区别呢?答案简单,m_array[5]ch在操作系统知道与管理的内存段中,也是人们所称的“栈”中,而ha_1为指向用于动态申请的内存段的指针,即指向存储在此段中的一个内存单元,也是储存在操作系统不直接(原因为:映射)知道的内存段中即“堆”中。而存储在两个不同的段中的变量有什么不同Google有详细的解释再此不再论述(其实简而言之区别就是最终由谁来把它们清扫干净)。

--------------------------------------------------------------------------------------------------------------------

Malloc例子:
#include <stdio.h>
#include <malloc.h>

int main(int argc, char **argv)
{
	unsigned char	ch_1 = '1';
	unsigned long*	ch;
	unsigned char*	ha_1;
	unsigned char	m_array[5] = {0};
	unsigned char	test;

	test = sizeof(ch_1);

	ch = (unsigned long *)0x0012ff71;
	*ch = 0x31;

	ha_1 = (unsigned char *)malloc(sizeof(unsigned char) * 5);

	*ha_1 = '1';
	ha_1++;
	*ha_1 = '2';

	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值