《C和指针》学习笔记六/结构、联合、 动态内存分配/

下标引用和点操作符具有相同的优先级,他们的结合性都是从左向右。

 

可以使用结构标签在不同的声明中创建相同类型的结构变量,typedef也可以实现这个目的。

 

结构的自引用
使用typedef为一个自引用的结构定义名字时应该小心。
struct SELF_REF1
{
 int a;
 struct SELF_REF1 b; //非法
 int c;
};
上面的这种类型的自引用是非法的
struct SELF_REF2
{
 int a;
 struct SELF_REF1 *b;
 int c;
};
上面的这种类型的自引用是合法的,如果你觉得一个结构内部包含一个指向该结构本身的指针有些奇怪,请

记住它事实上所指向的是同一种类型的不同结构。更加高级的数据结构,如链表和树,都是用这种技巧实现

的。

 

->操作符的优先级高于&操作符的优先级。

 

结构可以作为参数传递给函数,也可以作为返回值从函数返回。但是,向函数传递一个指向结构的指针往往效率更高。在结构指针参数的声明中可以加上const关键字防止函数修改指针所指向的结构。

 

位段(下面是一个位段声明的例子)
struct CHAR
{
 unsigned ch  :7;
 unsigned font :6;
 unsigned size :19;
};
struct CHAR ch1;

 

联合(union)的所有成员引用的是内存中的相同位置。

 

在一个成员长度不同的联合里,分配给联合的内存数量取决于它的最长成员的长度。如果成员的长度相差悬

殊,当存储长度较短的成员时,浪费的空间是相当可观的。在这种情况下,更好的方法是在联合中存储指向

不同成员的指针而不是直接存储成员本身。

 

联合的初始化
联合变量时可以被初始化,但这个初始值必须是联合第1个成员的类型。例如:
union{
 int  a;
 float b;
 char c[4];
}x={5};

 

 
C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。


malloc的参数就是需要分配的内存字节数。如果内存池中的可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块起始位置的指针。
另外还有两个内存分配函数,calloc和realloc。
calloc也用于分配内存。malloc和calloc之间的主要区别是后者在返回指向内存的指针之前把它初始化为0。
realloc函数用于修改一个原先已经分配的内存块的大小。

 

传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。

 

释放一块内存的的一部分是不允许的。动态分配的内存必须整块一起释放。但是,realloc函数可以缩小一块动态分配的内存,有效地释放它的尾部的部分内存。

 

内存泄漏是指内存被动态分配以后,当它不再使用时未被释放。内存泄漏会增加程序的体积,有可能导致程序或系统的崩溃。

 

 

 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值