C语言内存管理机制的一点小问题

先来一张高能的图:


这张图片上的结果是一个细心地小伙儿发现的。。嗯不如说是个疯狂的小伙儿。
第一行里指针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指向的已经不是当时你给它的那块空间了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值