第十章结构和联合、十一章动态内存分配

本文介绍了C语言中的结构体特性,包括结构体的自引用限制、复合使用、存储分配原则、传递方式、位段使用注意事项及联合的概念。此外,还详细讲解了动态内存分配函数如malloc、calloc和realloc的使用方法,并列举了一些常见的动态内存错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第十章结构

C语言中的结构就是Struct,几个特点注意:

1、不能自引用。要用自身必须要用指针。

2、复合使用2个结构体,需要在前面使用不完整声明

例如

struct B;
struct A{
    struct B;
...
}
struct B{
...
}
3、结构的存储分配

需要满足边界对齐条件,如:

struct ALIGN{
    char a;
    int b;
    char c;
};
如果机子的整型值长为4个字节,那么每个变量起始存储位置都要必须能被4整除,如果不够放的话。

所以这里占用了12个字节,如果把char放在一起,那么就是8个字节。

4、传递结构

直接传递结构的话,因为C语言中参数的传递方式是传递一份拷贝,如果是传递指针的话,会远远小于传递一个结构。

5、位段

可移植程序中药避免使用位段,位段在不同的系统中会有不同的结果。

可能第2个位段比较大,第一个位段剩余不足以满足时,编译器可能把第二个位段放在内存的下一个字。

可能位段大于某些机器的最大整数的位的长度,不能使用。

位段可能是从左到右分配也可能是从右到左。

int位段被当做有符号数或者无符号。

6、union

联合使用内存中相同的位置。其大小相当于里面最大的那个内存大小。

可以使用enum与union结合

struct VARIABLE{
    enum {INT,FLOAT,STRING} type;
    union{
        int i;
        float f;
        char* s;
    }value;
};
第十一章动态内存分配

malloc提取内存池当中一块合适的内存,返回一个指针指向它,动态分配的内存在堆中。如果malloc了必须free不然会导致内存泄漏。

malloc分配成功不成功需要进行检查。

char* s = (char*)malloc(10);
if(s==NULL)
    perror("s malloc");
calloc与malloc的区别是返回指向内存的指针之前把数组初始化为0,realloc用于修改一份已经分配的内存块的大小。

常见的动态内存错误:

1、对NULL指针的解引用

2、对分配的内存进行操作越界

3、释放不是动态分配的内存

4、释放一部分分配的内存

5、释放后的内存继续使用



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值