C开发经验4:内存管理以及数据类型
来源:互联网 发布:斧声烛影 知乎 编辑:程序博客网 时间:2024/06/05 18:52
一、内存管理
操作系统对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 * :就是把一个别人不知道数据类型的的内存首地址进行操作,由于不知道多少个字节,所以使用时需要进行转换
变量本质:一段连续内存空间别名,变量是一个标号
变量本质:一段连续内存空间别名,变量是一个标号
- C开发经验4:内存管理以及数据类型
- Objective-C 内存管理技巧与经验
- Objective-C 内存管理技巧与经验
- Linux c 开发 - 内存管理
- 征集C,C++,汇编以及拥有嵌入式系统开发经验
- object-c数据类型和内存管理初步 第四天
- 【Linux】Linux内存介绍以及C与C++内存管理
- 【操作系统】【C/C++开发】内存管理
- JVM内存管理优化经验
- C高级(4)--内存管理
- 有关C的学习笔记以及内存管理
- iOS开发之 内存管理以及深浅拷贝
- 内存管理以及分配
- 黑马程序员-C语言-内存管理概念、内存分区以及内存函数
- Android知识点以及开发经验
- iOS开发经验之多个UIImageView 加载高清大图时内存管理
- IOS开发基础Object-C(10)—OC内存管理(4)-autorelease使用
- [iPhone开发]Objective-C内存管理教程和原理剖析
- HTML5新特性介绍---(初试博客园)
- Python 基础爬虫简介(测试环境为 Python 2.7)
- 从尾到头打印链表
- hdu 1566 BIT 区间更新单点查询
- 机器人的指令 CSU - 1112
- C开发经验4:内存管理以及数据类型
- Android源码之ListView的适配器模式
- [DP] BZOJ1003: [ZJOI2006]物流运输
- Mysql中新建用户及授权的方法分享
- php接入支付宝接口以及嵌入thinkphp框架
- JAVA路径获取总结
- struts2获取参数的方法
- 替换空格
- html是什么,html5是什么?web开发必备知识之html