C语言内存管理机制的一点小问题
2014-12-17 16:53
211 查看
先来一张高能的图:
这张图片上的结果是一个细心地小伙儿发现的。。嗯不如说是个疯狂的小伙儿。
第一行里指针a,b竟然有相同的值,看这结果是不是很像引用?
理论上来说要用指针是要给它分配内存空间的,但是事实证明对这样的小程序来说char的指针不分配貌似也能直接用?这一点很不解,隐约感觉这一点和图片中显示的问题有很大关联。
内存分配方式有三种:
1、从静态存储区域中分配,如全局变量、static变量,生存期为整个程序;
2、从栈上分配,如函数内部的局部变量,函数执行完自动释放;
3、从堆中分配,如用malloc或calloc分配的单元,由free释放。
细分的话C编译的程序占用的内存分为好多块,大概有栈区、堆区、全局区、文字常量区、程序代码区。。
程序中的“abcde”是一个字符串常量是吧,那就应是位于文字常量区(仅个人意见),执行a="abcde"相当于是给a重新赋值,让它指向了“abcde”所在的地方,也就是说给a赋上了b的值;然后接下来再次给a赋值,它就指向了另一个字符串常量,因此a的值改变。
再来一张高能的图片:
a用malloc在堆中申请了一块空间,但是给它指向了一个另外的地方,用free释放a的时候就会出错,因为a指向的已经不是当时你给它的那块空间了。
这张图片上的结果是一个细心地小伙儿发现的。。嗯不如说是个疯狂的小伙儿。
第一行里指针a,b竟然有相同的值,看这结果是不是很像引用?
理论上来说要用指针是要给它分配内存空间的,但是事实证明对这样的小程序来说char的指针不分配貌似也能直接用?这一点很不解,隐约感觉这一点和图片中显示的问题有很大关联。
内存分配方式有三种:
1、从静态存储区域中分配,如全局变量、static变量,生存期为整个程序;
2、从栈上分配,如函数内部的局部变量,函数执行完自动释放;
3、从堆中分配,如用malloc或calloc分配的单元,由free释放。
细分的话C编译的程序占用的内存分为好多块,大概有栈区、堆区、全局区、文字常量区、程序代码区。。
程序中的“abcde”是一个字符串常量是吧,那就应是位于文字常量区(仅个人意见),执行a="abcde"相当于是给a重新赋值,让它指向了“abcde”所在的地方,也就是说给a赋上了b的值;然后接下来再次给a赋值,它就指向了另一个字符串常量,因此a的值改变。
再来一张高能的图片:
a用malloc在堆中申请了一块空间,但是给它指向了一个另外的地方,用free释放a的时候就会出错,因为a指向的已经不是当时你给它的那块空间了。
相关文章推荐
- 只要你的答案让我明白了如和使用Microsoft VisualC++6 但是我一点基础也没有。所以向大家请教 我想学习C语言 加分不是问题 还望得到大家的帮助 我一定把分数加到你满意为止
- iOS 内存管理的一点小问题
- C/C++内存管理一点问题
- OC的内存管理机制以及野指针问题
- C语言实现简单的内存管理机制
- 每天一点C语言--竖式问题
- 深入详解python传值问题及内存管理机制
- 每日一点C语言--开灯问题
- 内存管理分析之二:MMU机制在进程中使用时的一些问题
- 谁能给我介绍一点关于C语言的问题
- Linux内存管理机制控制--mallopt,避免大量小内存不回收问题
- 对这里的一点乱弹兼提问题。
- 自己学习C语言的一点心得
- 引用已有工程的一点问题
- 水滴石穿C语言之可变参数问题
- C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
- 前几天客户那里遇到了一点问题
- 一点ASP问题、差错和个人心得
- "善守"之道--谈软件开发中的监错/防错设计和异常处理机制问题——柯化成
- 水滴石穿C语言之编译器引出的问题