#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;
}