您的位置:首页 > 其它

unsigned char与unsigned char m_array[5]

2013-11-01 22:45 766 查看
#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;


得出结论:

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

Breakpoint:test = sizeof(ch_1);

内存:



改变内存单元号:

0x0012FF6C、0x0012FF7C、0x0012FF70~0x0012FF74;

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

Breakpoint:ch = (unsigned long *)0x0012ff71;

内存:



改变内存单元号:

+0x0012FF79~0x0012FF7B;

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: