第十章结构
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、释放后的内存继续使用