一、内存管理
操作系统对C语言运行的程序主要分为4个区域,包括:
(1)堆(程序员自己malloc的内存块)
(2)栈(普通变量、数组)
(3)全局区(公共变量、静态变量、常量)
(4)代码区(由系统管理)
规则1:主调函数的内存,在被调函数里面都可以使用
规则2:被调用函数里面分配的内存,临时区的会被回收,主函数不能使用(如果要返回内存,则需要使用malloc进行返回)
特别注意:数组是在栈上分配内存的,比如 char buf[100]
例:
int *p = (int *)malloc(40);
则操作系统会在堆上分配40个字节的地址空间,并将首地址返回。另外,系统会自动在栈上开辟1个4字节的空间存储指针变量p。
注意在32位的系统下,任何指针变量都是4个字节,存放在栈中。
看一段代码:
void main()
{
char * getstring1();
char * getstring2();
char * getstring3();
int * getint4();
char *p11 = getstring1();
char *p12 = getstring2();
char *p13 = getstring3();
int *p14 = getint4();
printf("%s\n",p11);
printf("%s\n",p12);
printf("%d\n",p11);
printf("%d\n",p13);
//打印出来居然一样,如果字符串等常量是一样的,操作系统在全局区只定义一份
//strcmp(p1,p2);
//指针变量与它所执行的内存空间变量时两个不同的概念
//局部变量的作用域
printf("%d\n",*p14);//地址已经被回收,得出来是错误的值
system("pause");
}
char * getstring1()
{
char *p1 = "abc";
return p1;
}
char * getstring2()
{
char *p2 = "def";
return p2;
}
char * getstring3()
{
char *p2 = "abc";
return p2;
}
int * getint4()
{
int a= 3;
int *p = &a;
return p;
}
二、数据类型
数据类型是什么?我们经常用数据类型定义各种变量,但对它的本质却没有研究。
在8086汇编中,数据类型一般只有字节,用户根据自己需要分配内存,根本不存在float\int等丰富的数据类型。那么对它本质的研究,有利于加深C语言的学习。
数据类型,就是固定内存大小的别名,相当于模具,用户可以根据需要用模具在内存中制作符合模具的内存,比如int 就是4个字节,这个别名你也可以进行改变,在C中使用typedef进行改变,比如typedef int myint.
比如调用WINDOWS API进行编程的时候,我们使用的Handle类型,其实就是int的别名,表示4个字节的内存。
再来看一个特殊的数据类型void*
void * :用于数据类型的封装
如果不想让别人知道这是什么数据类型 ,就是使用 void *
void * :就是把一个别人不知道数据类型的的内存首地址进行操作,由于不知道多少个字节,所以使用时需要进行转换
变量本质:一段连续内存空间别名,变量是一个标号
变量本质:一段连续内存空间别名,变量是一个标号