对于malloc函数和指针的一点点见解

对于malloc函数和指针的一点点见解

mlloc函数对于指针

malloc动态为指针变量申请一块内存空间(以字节为单位)(用于初始化指针变量),并返回该空间首地址。
函数原型为:void * malloc ( size_t size );

举例:(举例内容从老师ppt上抄的,如有雷同不是故意的)
char s;
int intptr;
s = (char )malloc(32); / s指向大小为32个字节(字符)的空间
/
s = (char )malloc(strlen§+1);/ s指向能正好存放字符串p的空间
/
intptr = (int )malloc(sizeof(int)10);/ ptr指向能存放10个整型元素的空间/

malloc函数的分配

下面讨论分配32个字节大小空间的情况:
我一开始没明白这个空间到底是怎样分配的,为什么可以申请不同大小呢(因为我一开始理解一个空间就是一个地址),后来经过查阅了解到:
在 C 语言中,每个内存单元都有一个唯一的地址,而每个内存单元的大小是一个字节。因此,在 C 语言中,字节和地址的关系是一一对应的。可以通过一个地址来访问内存中的一个字节,也可以通过一个指针来访问内存中的一个字节。同时,C 语言中还可以使用指针运算来访问内存中的连续多个字节。
所以分配32个字节空间其实就是分配32个地址。

指针的移动

然而,众所周知,数据类型(类型变量)所占长度的字节数都是不一样的,不一定是1。如果按照例子,s+1其实就是指向下一个地址,即下一个字节;那么假设我要给s分配int类型(占4个字节)的空间,分配32个字节,那s+1到底会怎样移动呢,经过测试,s+1移动了4个地址,记4个字节,也经过查阅资料,明白指针的移动是根据数据类型(类型变量)来的,即每次移动1个定义的数据类型(类型变量)的字节数,因此就可以非常简单地理解:“
两个指向同一数组成员的指针可进行相减,其结果为两指针间相差元素的个数。
如,p指向数组第一个元素,q指向数组最后一个元素,则q – p+1表示数组长度。”

越界报错

了解了如何分配空间和指针的移动之后,我就想起来之前经常发生的越界报错:
在C语言中,如果访问未被分配的内存区域,编译器通常不会直接报错。这是因为C语言中没有对指针的访问做越界检查。当程序访问未被分配的内存时,会导致不可预知的行为,包括程序崩溃、产生错误结果、修改其他变量的值等等。这些问题被称为"undefined behavior",编译器不会对其进行检查。
其实就是给你分配了32字节的空间,你却移动到第33个字节的地址去找东西,那当然会出错了。

(在写这篇文章的时候发现了自己不理解的地方,又鼓励我自己取查阅资料,我觉得这样总结和反思是一个好的学习方法,所以我决定之后每次有收获都要写一篇文章。)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值