- 博客(8)
- 收藏
- 关注
原创 动态内存管理详解
与函数malloc的区别只在于calloc会在返回地址之前把申请的空间的每个字节初始化为0.所以如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。在这种情况下,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。有时我们会发现过去申请的空间太小了,有时我们又会觉得申请的空间过大了,那为了合理的使用内存,我们一定会对内存的大小做灵活的调整。如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。
2025-10-25 19:12:11
356
9
原创 结构体详解
如果我们能保证将所有的double类型的数据的地址都对齐成8的倍数,那么就可以用一个内存操作来读或者写值了。4,如果出现嵌套结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。原因:函数传参的时候,参数是需要压栈的,会有时间和空间上的系统开销。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,就会导致性能的下降。(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍。
2025-07-26 14:06:14
329
3
原创 初步了解C语言数据类型
C语言原来并没有为布尔值单独设置一个类型,而是使用整数0表示假,非0值表示真。所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。联合体的特点是所有成员共用同一块内存空间,所以联合体也叫。结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量,数组,指针,甚至是其他结构体。给联合体其中一个成员赋值,其他成员的值也跟着变化。二,内置数据类型长度。
2025-07-19 17:46:06
403
原创 数据在内存中的存储
同时,加法和减法也可以统一处理(CPU只有加法器),此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。对于64位的浮点数(double),最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位的浮点数(float),最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。两部分,在二进制序列中,最高那一位是被当做符号位,剩余的都是数值位。,而数据的高位字节内容,保存在内存的低地址处。,而数据的高位字节内容,保存在内存的高地址处。
2025-07-18 16:55:38
317
原创 C语言指针详解
同理,在计算机中,我们想要快速在内存中找到指定的数据,需要给每个内存单元编号(相当于门牌号),有了这个内存单元的编号,CPU(中央处理器)就可以快速找到一个内存单元。n在C语言中被称为常变量,常变量的意思是,n的本质是变量,但是不能被修改,即具有常属性的变量。const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变,但是指针变量本身的内容可变。const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
2025-07-11 19:20:18
5960
2
原创 C语言函数递归
函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。所以如果采用函数递归的方式完成代码,递归层次太深(递归函数调用次数太多),就会浪费太多的栈帧空间,也可能引起栈溢出的问题。1.递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。上述的Fact函数可以产生正确的结果,但是在递归函数的调用的过程中涉及一些运行时的开销。上述代码也可以完成求n的阶乘,并且效率比递归的更高。
2025-04-22 20:11:03
426
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅